OGRE中的数据驱动

今天在LinkedIn中的“OGRE3D 中文网”看到免费打工仔回答一个网友关于数据驱动的问题,感觉很受启发,故将其整理如下,以便日后参考。

问:我目前的疑惑是:我把数据保存在不同的类的属性中,然后在一个object类中引用到这些类。如何动态地得到这些关联类的属性(这些属性都保存在XML文件中)?或者我应该全部加载它们,然后需要的时候查询? 或者谁发个典型的数据驱动的例子?

问题补充:我在ogre3d论坛得到了一些启示~~~使用描述结构来生成类或者使用clone技术生成。工厂只负责读取一个保存了各个不同属性的同类别类的列表,实际并不生成。在需要用到的时候查询然后生成。跟我想的有点类似~~~关于一个对象引用其他对象,其实在需要生成这个对象的时候就把它需要的引用对象生成,然后一直存在。因为这些如粒子、声效的对象本来就属于这个对象的,摧毁该对象时一并摧毁就行。看来有眉目了~~~

回答:关于数据驱动, 我没有上升到理论的高度,谈谈自己的看法.

首先,游戏中所有存在的抽象都是组件, 组件中包含属性, 一般而言我是通过 boost::property_tree 来实现属性的管理,一是因为他支持多种输出 xml, json以及ini,其次是其能很好的和流结合,结合boost的流的扩展,我一般喜欢用一个bzip压缩数据(也可以进行加密)。

不过数据驱动只能占组件驱动的一半,对于逻辑而言这种通过类似xml的驱动未免力不从心,所以另外一半对逻辑的驱动采用比如lua脚本这种,我使用的是swig,所以可以很好的移植到python等其他脚本语言上。

逻辑中的有限状态机分为两个部分,其一是C++有限状态机,采用boost里面提供的。这个因为是模板实现,所以不能运行期间改变。另外是游戏变成精粹里面介绍的通过编辑器生成lua有限状态机,这个可以很好的和swig导出接口结合。这两个状态机并没有统一到一个体系中来。根据对于效率和灵活的不同需求在不同场合取舍使用。

其实对我而言无所谓数据驱动,而主要是组件的思想,其中包括
1. 以组合代替继承

1. 接口和实现完全分离,(接口组合进实现,而不是继承,类似卡马克的函数指针,不过用boost的仿函数来代替)

1. 通过rtti动态识别接口(有人可能会反对,但我认为存在必然合理,反射机机制用rtti来作是最简单和清晰的)


其实用已有的工具很容易实现这套体系 
总结而言。

boost bind + function来实现接口, boost::property_tree 实现属性, 通过流来保存
SWIG导出接口到脚本。当然还有工厂模式,我时通过boost::factory和boost智能指针结合来实现。

本着不重复制造轮子的黑客原则,其实自己写的代码并不多。

你可能感兴趣的:(OGRE中的数据驱动)