如果游戏逻辑用Lua开发的话,那么配表读取就很方便了,可以写一个转换工具,把策划配好的Excel表转换为Lua文件,直接用table保存所有的配表数据,Lua直接读取就好了,不需要解析,效率也非常高。
但我前几个游戏都是用C++开发,而且由于上一个项目配表比较多(估计有上百个),让我不得不关注配表读取的效率问题。
一开始的解决方案是写了一个工具,把Excel转换成xml文件,然后用TinyXml读取,但后来发现TinyXml解析是非常慢的,后来为了优化速度,把配表读取改成了RapidXml(它用了内存池和字符串浅拷贝等方式提高效率),简单测试过,配表读取时间大概是原来是1/3。
(p.s. 插一句,其实Cocos2d-x精灵框帧的plist文件默认是用TinyXml解析,如果都改成RapidXml,相信会有性能提升。)
后来我注意到Cocos2d-x 3.x版本的加载3D模型文件.c3b就是用二进制读取的方式(引擎代码在CCBundle3D),用二进制的方式比起用xml、json那些方式,无论是在文件的大小上,还是读取的效率上,都有质的提升。于是我开发了一个工具生成二进制配表文件,写文件的时候,对于各种类型:
1. 整型:用1~8个字节保存,很小的数字用1byte保存,很大的数字用8byte保存
2. 浮点型:4byte或8byte保存
3. 字符串:先用4byte保存字符串长度,后面再接上字符串内容
读取的时候,按照写的顺序读取。
经简单测试,由于不用解析,读取总时间大概是RadpidXml的1/10。
其实还有其他读取配表文件的方法:
1. 用.csv文件,用逗号分隔格式,文本格式
2. 用google的protobuf,其实也是二进制格式,但可以用key-value的方式,效率也非常高
3. 还是用Lua保存,但读取的时候用C API读取(参见《Lua程序设计》 24 25章)
(这几个方法我都没测试过效率,没权发表评论,请测试过效率的朋友指点)