posts - 72,  comments - 4,  trackbacks - 0

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 阅读(305) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理