Clyde学习笔记三(Config)

在clyde中,几乎所有的外部资源都是以config的形式存在。每个config都有一个name来唯一标识这个config。ManagedConfig是所有config的基类,它是一个抽象类,定义了一些最基础的方法,ParameterizedConfig是它直接的子类。

 

1. ParameterizedConfig

 

ParameterizedConfig引入了parameter这一概念,利用parameter可以实现对config的个性化定制,这样可以复用绝大多数的config,并且减少config的数量。比如你有一个model,这个model在不同的场景需要应用不同的贴图,那么与其制作2个不同的config,不如利用parameter这一特性,在resource editor中选择创建一个direct parameter,给它一个名字叫“Texture”,然后把鼠标移到material mapping这一栏,按下ctrl-shift-C,复制material mapping属性的路径到剪贴板,然后再把此路径粘贴到刚才创建的parameter的path中。完成后,以后在代码中,可以这样来引用:

 

new Model(ctx, "flag.dat", "Texture", "texture.png");


 

“Texture”是parameter的name,“texture.png”是parameter的值。在其内部是以一个argumentMap来实现的。

 

 

/** The arguments applied to the configuration, if any. */
    @DeepOmit
    protected transient ArgumentMap _args;

 

以此也引申出base和derived概念。

 

 

    /** The instance from which the configuration is derived, if any (used to prevent the base
     * from being garbage-collected). */
    @DeepOmit
    protected transient ParameterizedConfig _base;

   /** Maps arguments to derived instances. */
    @DeepOmit
    protected transient SoftCache<ArgumentMap, ParameterizedConfig> _derived;

 

2. ConfigReference

 

ConfigReference以name和argumentMap属性保存了对一个config的引用,因为我们已经知道每个config都有一个name,但是这个name指向的config包括base和derived部分,所以以name和argumentMap可以唯一确定一个config的值。

 

 

    /** The name of the referenced configuration. */
    @Intern
    protected String _name;

    /** The arguments of the reference, mapped by name. */
    protected ArgumentMap _arguments = new ArgumentMap();
 

如果这个configReference是可以被编辑的,即标注有@Editable,在config editor中可以被编辑,并且在编辑时可以看到保存在configReference中的parameter的值。而且这个configreference是可以被嵌套的,比如说modelConfig中有materialMapping,materialMapping中有一个configReference<MaterialConfig>,在MaterialConfig中有一个configReference<TextureConfig>,那么在创建一个materialMapping的时候可以编辑一个MaterialConfig,在编辑MaterialConfig时可以再继续编辑TextureConfig。

 

3. ConfigGroup

 

在clyde中,几乎所有的配置都保存为config,都是从同一个基类中派生出来,但是从应用的角度来讲,一般可以分成2类,一类是所谓的managed config,像角色或者场景中的对象,它们在ConfigManager启动的时候被加载进来,保存在文件系统的rsrc/config路径下,并且在classpath中的rsrc/config路径下有一个manager.properties文件,一个典型配置文件看起来如下:

 

 

types = global, model, user_interface, scene

global.classes = com.threerings.tudey.config.ActorConfig, \
  com.threerings.tudey.config.AreaConfig, \
  com.threerings.tudey.config.BehaviorConfig, \
  com.threerings.opengl.gui.config.CursorConfig, \
  com.threerings.tudey.config.EffectConfig, \
  com.threerings.opengl.gui.config.FontConfig, \
  com.threerings.tudey.config.GroundConfig, \
  com.threerings.opengl.material.config.MaterialConfig, \

model.classes = com.threerings.opengl.gui.config.CursorConfig, \
  com.threerings.opengl.gui.config.FontConfig, \
  com.threerings.opengl.material.config.MaterialConfig, \

user_interface.classes = com.threerings.opengl.gui.config.CursorConfig, \
  com.threerings.opengl.gui.config.FontConfig, \
  com.threerings.opengl.gui.config.StyleConfig

scene.classes = com.threerings.tudey.config.ActorConfig, \
  com.threerings.tudey.config.AreaConfig, \
  com.threerings.tudey.config.EffectConfig, \
  com.threerings.tudey.config.GroundConfig, \

resource.classes = com.threerings.opengl.model.config.ModelConfig, \
  com.threerings.opengl.model.config.AnimationConfig, \
  com.threerings.opengl.gui.config.UserInterfaceConfig
 

在这里,每个config class对应的不再是一个单个的config,而是一个config group,每一个config group在文件系统rsrc/config路径下会有一个对应的.dat文件,在configManager启动时,会默认的读取type为global下每个config class对应的.dat文件,载入相应的config group。这些config可以在config editor中被编辑。


在上图可以看到,global标签页对应的是global type,group对应的是每一个config class,在每个group下有多个config,这些config还可以以目录的形式组织起来。

 

除了managed config之外,还有单个形式的config,比如model或者animation,这些config只有在需要用到的时候才会被载入,model和animation是在resource editor中编辑的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 接下来的n行描述了每个男性的次选列表,最后的n行描述了每个女性的次选列表。假设每个人都喜欢别人,即不存在不喜欢的情况。求稳定婚配方案。 稳定婚配的定义:不存在一对男女,他们可以离开自己的配偶并且彼此更喜欢对方。 输入格式: 第一行,一个整数T,表示测试用例的数量。 对于每个测试用例,第一行包含一个整数n,表示男性和女性的数量。 第二行包含n个单词,表示男性的名字。 第行包含n个单词,表示女性的名字。 接下来的n行,每行包含n个单词,表示男性的首选列表。 接下来的n行,每行包含n个单词,表示女性的首选列表。 接下来的n行,每行包含n个单词,表示男性的次选列表。 接下来的n行,每行包含n个单词,表示女性的次选列表。 输出格式: 对于每个测试用例,输出一个稳定婚配方案。每个方案占一行,格式为“男性名字-女性名字”。 输入样例: 1 3 amy bob clyde AMY BOB CLYDE AMY BOB CLYDE BOB AMY CLYDE AMY BOB CLYDE CLYDE AMY BOB AMY BOB CLYDE AMY BOB CLYDE 输出样例: amy-AMY bob-BOB clyde-CLYDE ### 回答2: C语言稳定婚配问题是一个经典的算法问题,即给定一个男女人数相等的集合,每个人有一个名字和一个倾向性列表,要求找出一种匹配方案,使得每个人都有且只有一个配偶,并且不存在不稳定对(即存在一对男女,他们更倾向于对方而不是自己的配偶)。 对于每个测试用例,我们首先读取人数n,并依次读取男性和女性的名字。然后,我们按照题目给定的顺序,依次读取每个男性和女性的首选列表。 下面是一个C语言实现的伪代码: ``` #include <stdio.h> #include <stdbool.h> #define MAX_N 27 typedef struct { int idx; // 男性在女性首选列表中的索引 int spouse; // 男性的配偶 int preferences[MAX_N]; // 女性的偏好列表 } Man; typedef struct { int idx; // 女性在男性首选列表中的索引 int spouse; // 女性的配偶 int preferences[MAX_N]; // 男性的偏好列表 } Woman; Man men[MAX_N]; Woman women[MAX_N]; int n; void stableMarriage() { // 初始化所有人未匹配 for(int i = 0; i < n; i++) { men[i].spouse = -1; women[i].spouse = -1; } // 进行稳定婚配算法 // 循环直到所有男性都成为稳定婚配 while(true) { bool finished = true; for(int i = 0; i < n; i++) { if(men[i].spouse == -1) { // 该男性未匹配 finished = false; int w = men[i].preferences[men[i].idx]; men[i].idx++; if(women[w].spouse == -1) { // 该女性未匹配 women[w].spouse = i; men[i].spouse = w; } else { int currentSpouse = women[w].spouse; if(women[w].preferences[i] < women[w].preferences[currentSpouse]) { men[currentSpouse].spouse = -1; women[w].spouse = i; men[i].spouse = w; } } } } if(finished) break; // 所有男性都已匹配 } } int main() { int t; scanf("%d", &t); // 输入测试的次数 while(t--) { scanf("%d", &n); // 输入人数 for(int i = 0; i < n; i++) { char name[2]; scanf("%s", name); // 读取男性名字 // 在这里可以将男性名字保存在men[i].name中 for(int j = 0; j < n; j++) { int preferences[2]; scanf("%d", &preferences[j]); // 读取男性偏好列表 men[i].preferences[j] = preferences[j]; } } for(int i = 0; i < n; i++) { char name[2]; scanf("%s", name); // 读取女性名字 // 在这里可以将女性名字保存在women[i].name中 for(int j = 0; j < n; j++) { int preferences[2]; scanf("%d", &preferences[j]); // 读取女性偏好列表 women[i].preferences[j] = preferences[j]; } } stableMarriage(); // 进行稳定婚配算法 // 输出每个男性及其配偶的配对情况 for(int i = 0; i < n; i++) { printf("%c %c\n", men[i].name, women[men[i].spouse].name); } } return 0; } ``` 以上是一个简单的实现稳定婚配问题的C语言程序,核心部分是稳定婚配算法,通过该算法可以得到每个男性及其配偶的配对情况。 注意:伪代码中的代码并未考虑边界情况和输入输出格式,实际使用时需要根据题目要求进行适当的调整。 ### 回答3: 题目要求通过给定的男性和女性的名字以及他们的首选列表,推导出稳定的婚配。 对于每个测试用例,我们可以使用“稳定婚配算法”来解决问题。具体步骤如下: 1. 首先,创建两个字典,分别用于存储男性的首选列表和女性的首选列表。字典的键是男性或女性的名字,值是一个列表,按照优先顺序列出了他们的首选对象。 2. 初始化一个空的字典,用于存储男性和女性的婚配结果。字典的键是男性的名字,值是他所匹配的女性的名字。 3. 创建一个队列,用于存储尚未分配配偶的男性。 4. 遍历所有的男性,将他们都加入队列中。 5. 进行以下循环,直到队列为空: - 从队列中取出一个男性。 - 获取他的首选女性列表。 - 遍历该列表,找到他尚未向其求婚的女性。 - 如果该女性没有婚配对象,则将男性和女性配对,并将匹配结果存入婚配字典中。 - 如果该女性已有婚配对象,则比较该女性对当前男性的偏好和她当前的配偶的偏好。 - 如果该女性更偏好当前男性,则替换她的配偶,并将原配偶重新加入队列。 - 如果该女性更偏好当前配偶,则继续遍历下一个女性。 6. 循环结束后,返回婚配字典即为稳定的婚配结果。 根据上述步骤,我们可以编写一个函数来实现稳定婚配问题的解决。函数的输入为男性和女性的名字列表以及他们的首选列表,输出为稳定的婚配结果。 这样,我们就可以通过此函数解决给定的稳定婚配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值