zhouqijie

世界组块的数据格式

游戏世界包含静态和动态元素(游戏对象)。

每个游戏对象的数据包含两个部分:

  1. 对象属性的初始值。(对象在游戏世界的初始状态)
  2. 对象类型。(对象为中心的引擎中可能是字符串散列符,属性为中心的引擎中可能是显式存储的类型)




1.二进制对象映像(binary image)

把游戏对象存储于磁盘的一个方法是直接把游戏对象的二进制映像写入文件,映像在磁盘中的样子和对象运行时在内存中的样子完全相同。

需要对指针做处理。对于内部引用可以使用指针修正。

对于经常修改的对象不方便,只适合更稳定的数据结构例如网格数据等。




2.对象序列化

序列化(serialization)是另一种把游戏对象状态存储到磁盘文件的方法。

从内存序列化至磁盘时让对象生成一组包含足够细节的数据,用于以后重建原本的对象。从磁盘反序列化至内存时,先创建对应类的实例,然后读入数据初始化新对象的状态。

Jason:有些编程语言原生支持序列化,例如Java和C#都提供序列化对象至XML的机制。但是C++没有标准化的序列化机制。

Jason:XML是流行的对象序列化格式,但是有些引擎会自定义二进制格式,比XML解析更快。

Jason:二进制映像存储和序列化都只能在运行时进行。如果需要编辑器和运行时引擎解耦,可以使用生成器及类型Schema。

两种序列化实现机制:

  1. 在基类加入两个虚函数Serialize()Deserialize(),在不同的派生类中实现这两个函数。
  2. 实现一个C++类反射系统。用一个通用的系统去自动序列化任何包含反射信息的对象。

C++的反射实现略。
Ye:可以像SWIG那样编译头文件生成反射数据。还可以改造编译器,在编译的时候生成反射数据。

(END)