Unreal2初步分析(u3的底层架构基本不变,跟u2相同)
Unreal2打造一套和脚本紧密结合的引擎
总概:
具体过程:
一。生成类信息体PrivateStaticClass:
dll装载时:
dll各类全局静态类信息对象PrivateStaticClass的构造函数中产生对应类的信息(对应包名,分配函数,静态构造函数),
各对象存入GAutoRegister链表.
二。初始各类信息体:
appInit()调用时:
1. 遍历GAutoRegister链表, 注册每一个静态类信息对象, 使用对应包名(所在dll)为其产生对应UPackage对象,获得对应dll句柄。
2. 并构造类成员Defaults缺省对象,将基类全局静态对象中成员default数据拷给它(所谓继承), 并用其作为this调用类对应静态构造函数,
3. 可在静态构造函数中注册类成员变量,注册的变量将作为原PrivateStaticClass对象的children结点.
5. 接着遍历全局静态对象的Children,将它们归类放在PropertyLink和ConfigLink链中(其中PropertyLink是全部所有属性)
6. 再来就是可通过config装载它自己的属性初始值到Default对象中。
三。 引擎初始:
1. 先初始引擎类:
EngineClass = UObject::StaticLoadClass( UGameEngine::StaticClass(), NULL, TEXT("ini:Engine.Engine.GameEngine"), NULL, LOAD_NoFail, NULL );
a. 为其产生ULinkerLoad:
在ULinkerLoad构造函数中:
1). 打开对应的包文件Engine.u, 并将它的LinkerRoot指向该类对应的包对象,
2). 从文件中读取Summary,名字表,导入导出表,最后将此ULinkerLoad对象存入GObjLoaders列表中,
3). 再通过 VerifyImport(i)来遍历导入表检查每一个导入项的有效性,
下面具体分析a. 步骤中VerifyImport(i)的内容:
每个导入表记录了在哪个包的名称,对应哪个类的名称,这个校验首先查找创建对应包对象(存dll句柄)以及对应ULinkerLoad对象(存包对应的.u文件句柄)
而在为导入项产生ULinkerLoad的构造函数中又回到了 1). 的步骤中,如此循环不停地装载所有依赖的dll及对应的.u文件。
b. 通过ULinkerLoad对象来产生对应的GameEngine对象
Linker->Create()即是通过.u文件读入的导入类来产生该对象(同时让SuperField指向产生根结点)并加到GObjLoaded链表中,如果产生失败,则
转换Result = StaticFindObject( ObjectClass, InOuter, InName );来通过dll中的类来产生它。
c. EndLoad()
遍历GObjLoaded链表,装载用Object->_LinkerIndex取出对应FObjectExport,将其属性内容读入该对象内容。
[注意]是先从基对象SuperField->Preload()开始再到其派生类逐步读入。另外在UStruct的Serialize函数中会装载children,
这又会依赖其它导入导出库,因此会重复多次触发导入导出相关处理。
另外如果是Native类,就不会通过link的create,而是通过StaticFindObject返回一个
2. 再产生引擎实例:
UEngine* Engine = ConstructObject<UEngine>( EngineClass );
这是使用第1步生成的EngineClass(即GameEngine对象)来创建一个新的名为GameEngine0的对象.(这会将GameEngine对象的内容克隆给GameEngine0)
然后再调用类的构造函数UGameEngine::UGameEngine()来初始成员。
3. 初始引擎:
Engine->Init();
遍历GObjObjects链表,进行加载
四。关于.u文件的生成:
由uccdepend转调用ucc.exe来遍历查找所有packages来读取uc脚本生成。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flipcode/archive/2010/04/06/5453730.aspx
posted on 2010-11-03 23:13
flipcode 阅读(313)
评论(0) 编辑 收藏 引用