Cloning Internals Cloning是产生对象的拷贝的一种方法。应用程序调用下面的的函数来克隆对象。第一个函数使用缺省值来克隆对象名称,这在后面讨论。第二个版本允许通过NiClonigProcess来实现局部控制,这是为多线程情况下设计的函数。 NiObject* NiObject::Clone(); NiObject* NiObject::Clone(NiCloningProcess& kCloning); 使用克隆而不是通过例如从NIF文件中重复加载场景图的优点是这一类型的对象往往要耗费很多的内存,通过克隆来像NiGeometryData中的顶点数据可以被多个克隆对相共享,而通过单个NIF文件加载多次时她的顶点数组却是重复的。 为了得到一个对象的一个彻底的深拷贝可以使用 NiObjectPtr NiObject::CreateDeepCopy 这个调用使用流系统将对象保存到一个内存块中,然后加载这个内存快到一个新的对象。请小心使用深拷贝。有大量模型数据和纹理关联的对象应该尽可能使用共享数据。深拷贝不共享任何的东西。 下面的一些静态NiObjectNet中的静态函数用来决定存储在NiObjectNET中的对象名称在克隆的时候得缺省设置。 static void SetDefaultCopyType(CopyType eCopyType); static CopyType GetDefaultCopyType(); static void SetDefaultAppendCharacter(char cAppendCharacter); static char GetDefaultAppendCharacter(); The possible values of NiObjectNET::CopyType, the enumerated type that specifies the copy mode, are: 指定复制模式的NiObjectNET::CopyType枚举类型的可能值如下: 枚举 描述 COPY_NONE 不复制名字字符串,新的克隆对象的名字设置为NULL。 COPY_EXACT 新的克隆对象的名字字符串直接从原来的对象的名字中复制过来。 COPY_UNIQUE 新的克隆对象的名字字符串是原来对象的名字添加一个字符。添加的字符通过NiObjectNET的静态函数SetAppendCharacter和GetAppendCharacter来访问。 通过SetDefaultCopyType和GetDefaultCopyType访问的变量的缺省值是COPY_NONE。通过SetDefaultAppendCharacter和GetDefaultAppendCharacter访问的变量的缺省值是‘$’。 多线程时的克隆 单线程程序调用NiObject的Clone()成员不用考虑其他线程的影响。而多线程时,从GetDefaultCopyType和 GetDefaultAppendCharacter的返回值可能在另外的一个线程通过调用SetDefaultCopyType和 SetDefaultAppendCharacter时发生变化。这个函数不是线程安全的。在多线程应用程序中应用程序克隆的时候应该在 NiCloningProcess对象中设置一个局部的复制类型和添加字符,如下所示: NiCloningProcess kCloning; kCloning.m_eCopyType = NiObjectNET::COPY_EXACT; kCloning.m_cAppendChar = '%'; NiObject* pkClone = pkNode->Clone(kCloning);
|