Yuri-IL的解析
定义
Yuri引擎会在启动游戏的时候解析所有的Yuri-IL中间代码文件,恢复动作流程图,进行指令索引,并加载初始场景到调用堆栈。
IL对象的数据结构
动作包装SceneAction
字段名 | 类型 | 备注 |
---|---|---|
NodeName | String | 节点名称(场景名_脚本中行号) |
Type | SActionType | 动作类型 |
ArgsDict | Dictionary | 参数字典(K:参数名;V:参数的逆波兰式) |
CondPolish | String | 条件子句的逆波兰式 |
Next | SceneAction | 下一指令指针 |
TrueRouting | List | 真值子路径 |
FalseRouting | List | 假值子路径 |
IsBelongFunc | Boolean | 是否是函数动作 |
ReliedFuncName | String | 包装该动作的函数名 |
Tag | String | 附加值 |
函数包装SceneFunction
字段名 | 类型 | 备注 |
---|---|---|
Sa | SceneAction | 函数动作序列入口 |
Callname | String | 函数名 |
Param | List | 形参名字列表 |
ParentSceneName | String | 函数所属场景的名字 |
Symbols | Dictionary | 函数的符号表,即运行时上下文容器 |
LabelDictionary | Dictionay | 标签字典 |
场景包装Scene
字段名 | 类型 | 备注 |
---|---|---|
Ctor | SceneAction | 场景动作序列入口 |
Scenario | String | 场景名 |
YuriDict | Dictionary | 动作索引 |
FuncContainer | List | 场景子函数向量 |
ParallellerContainer | List | 场景并行处理函数向量 |
LabelDictionary | Dictionay | 标签字典 |
将IL恢复为内存对象
Yuri引擎负责解析Yuri-IL中间代码的模块是Yuri.PlatformCore.VM.ILConvertor
,它按照如下逻辑进行解析工作:
- 检索脚本目录下所有的中间代码文件,以“.SIL”后缀名结束的文件,将读入的文件做行分割
- 顺序遍历行分割的结果,将分割的行对象按场景按照行在文件里的顺序组织好
- 对每个场景下的行,抽取其在全局脚本中的唯一编号来恢复代码逻辑关系。其过程是以这样的顺序做广度优先遍历:
- 恢复该中间代码行为一个动作序列
SceneAction
对象 - 标记该行是脏的,即以后不再考虑这个行,也不从这个行继续搜索
- 如果该对象是一个标签指令,那么记录它的位置
- 处理该对象的Next指针,即下一指令指针
- 处理该对象的真值路径TrueRouting,即该动作节点的子路径,在IF结构中,它是条件为真时的语句块;在FOR结构中,它是循环体语句块。
- 处理该对象的假值路径FalseRouting,即该动作节点的条件子句不满足时的子路径。 在IF结构中,它是条件为假时的语句块。
- 恢复该中间代码行为一个动作序列
- 将处理完毕的动作序列包装成函数对象
SceneFunction
和场景对象Scene
注意资源必须被放置在正确的目录下才能被引擎正确地引用。
程序集信息
Property | Value |
---|---|
层次结构 | Yuri.PlatformCore.VM.ILConvertor |
最低版本 | 1.0 |
并行安全 | 否 |