Gamebryo3.0SDK翻译-Object System

Object System

一、 简介

clip_image002

1. 引用计数和智能指针

GB中NiRefObject子类都是基于引用计数的,使用智能指针实现引用计数的半自动化。

正如在NiRefObject中讨论的那样,智能指针智能指向在堆上动态分配的对象。永远不要将智能指针指向一个在栈上的对象(局部变量)。永远不要将智能指针指向一个静态的对象。

如果一个函数使用智能指针作为参数,那么不要把一个没有被其他智能指针引用的对象常规指针作为参数传入到函数中。

智能指针系统提供了两个宏,一个永远定义智能指针类型另一个用来智能指针类型转换。

类型定义的宏是NiSmartPointer(classname)。

例子如下NiSmartPointer(NiNode)
类型转换宏是NiSmartPointerCast(classname, pkObject)。

如下是典型的使用:
NiAVObjectPtr spChild = <some pointer known to be an NiNode>;
NiNodePtr spNode = NiSmartPointerCast(NiNode, spChild);

2. 运行时类型信息

RTTI的功能:

(1)判断一个对象是否为指定类的对象

(2)判断一个对象是否为指定类的子类

(3)动态改变一个父类对象指针,到子类对象指针

clip_image004

RTTI的实现:

每一个类的RTTI信息存放在一个静态NiRTTI对象里,该对象的地址对每一个类来说时独一无二的,所以可以通过该地址来进行判断。

3. 克隆

浅拷贝

NiObject* NiObject::Clone()

使用一个默认的值作为克隆对象的名字。

NiObject* NiObject::Clone( NiCloningProcess& kCloning )

对克隆过程做更多的控制。

以上都是属于浅拷贝,这些对象会共享内存中相关数据。如顶点、纹理。。。

深拷贝

NiObjectPtr NiObject::CreateDeepCopy

这个拷贝过程,是使用数据流系统在一个独立的内存中保存一个对象,深拷贝不会共享任何数据。

更新:克隆的对象尽量在绘制之前进行更新。

克隆对象名字:

COPY_NONE:克隆对象的名字为NULL

COPY_EXACT:把原对象的名字复制到新克隆的对象

COPY_UINQUE:使用指定字符作为克隆对象的名字,这些字符可以使用SetAppendCharacter和AppendCharacter来设置和获取。

克隆的行为:

clip_image006

多线程处理:

单线程可以直接使用Clone函数

多线程

clip_image008

4. 流

GB提供流的形式从而实现从磁盘或存储区域保存和加载场景以及其它对象-NiStream。

流对象链表操作:

clip_image010

流的保存:

clip_image012

可以通过保存场景的根节点来保存整个场景数据

流的加载:

clip_image014

该过程只枚举最顶层的对象。

clip_image016

后台加载

之前的加载都属于同步加载,NiStream支持异步加载-后台加载。从而使得当前应用程序可以进行其它工作,如绘制加载进度条。

clip_image018

在所有平台里,后台加载线程比创建它的前台线程要低一个级别。

纹理流优化

NIF中的纹理可能被共享(nif文件内部和nif文件之间)。在nif之间他们共享的时texture palette。

NiSourceTexture和NiSourceCubeMap纹理对象可能从NiPersistentSrcTextureRendererData和NiPixelData对象来创建。

导出几何数据流

5. 命名

NiObjectNet支持使用字符串来识别对象和在继承中搜索对象。

clip_image020

6. 额外数据

NiObjectNET类提供了向NiObjectNET添加额外的数据

主要操作:

clip_image022

ExactData类型

clip_image024

7. 时间控制

NiObjectNET提供了时间控制

相关操作:

clip_image026

8. 多线程处理

二、 内核

1. 对象系统的内核

2. RTTI细节

3. 克隆

4. 数据流

5. 静态数据管理

posted on 2011-02-27 14:14  arun  阅读(418)  评论(0编辑  收藏  举报

导航