IxEngine开发笔记

导航

第十八回 Dummies,MOPP和表格

这回介绍的几个资源都没有太多的内容,所以就放在同一篇里了.

 

首先是Dummies,所谓Dummies是指多个Dummy的集合.一个Dummy通过一个名字来标识自己,它可以绑定在一个骨架系统的某一根骨骼上,并且它有一个基本的形状,通常这些形状都是些简单的几何体,比如Point,Sphere,Box,Capsule等,多个Dummy可以组成一个Dummies资源,只要它们都绑定到同一个骨架系统上.Dummies资源主要通过max导出生成,在导出时,我们会检查绑定在骨骼系统上的各个Node,如果某个Node符合Dummy的命名规则的话,我们会把它作为一个Dummy导出,记录下它的名字,以及它绑定的骨骼. 并且根据不同的名字的前缀决定它的类型.比如一个命名为{bb_foot}的node会被倒出为一个名为foot的Box类型的Dummy.最终绑定在同一根骨骼上的多个Dummy会被保存为一个Dummies资源.

 

Dummies资源目前主要有三个用途:
1.作为骨骼上的挂接点.可以在Dummy上挂接各种模型,或者其它骨架系统.通常这样的Dummy不需要任何形状信息,或者说它的形状就是一个点(Point)

 

2.作为骨架的外形模拟,在游戏中可以用于快速的HitTest.

 

3.作为物理系统中用到的RigidBody的外形模拟.

 

目前我们把用作挂接点的dummy和用于形状模拟的dummy区分开来,保存为两个不同的dummies资源.这两个资源加上一个骨骼动画资源,一个动画树资源,就构成了一个角色的最核心的部分,我叫它Avatar(也就是阿凡达).这个以后还会再提到.

 

除了Dummies资源,另外还有一个资源也用于物理系统中的外形模拟,就是MOPP资源,用过Havok(哈佛客)引擎的同学可能知道这个东西.目前engine中的物理系统使用了Havok引擎(真后悔用它,应该用Phyx的),MOPP是Havok提供的一种数据结构,用于比较大型的模型(比如建筑)的外形模拟,除了三角形信息以外,Mopp还记录了一些场景分割的信息,用于在碰撞检测中快速查询三角形.Havok提供了一些函数来把一堆三角形转成MOPP格式的数据,我们在导出插件中调用了这些函数,把转好的MOPP格式数据直接保存为MOPP资源.

 

再说一下Sheet(表格)资源.表格是网游开发不可缺少的工具了,我把它当作资源处理.通常一个表格文件使用文本格式,本质上就是一个用换行符和制表符分隔的字符串.这个资源读到内存中后的存放方式有些讲究,为了提高读取速度,我们采用了下面的存放方式:
*.整个文本字符串被一次性读入,存在一个char buffer中
*.在这个char buffer中,我们把所有的换行符和制表符用\0代替
*.再分配一个cell buffer,大小是表格的宽x高,每个cell记录一个const char *的指针,指向char buffer中的这个cell对应的内容
这样一共我们只需要分配两个大大的buffer,不需要分配很多小片内存(要是每个cell都用一个std::string,那肯定完蛋),可以提高载入速度.

 

当然,这只是个小技巧,不是很麻烦的事,Sheet资源最麻烦的是表格原始文件的直接读取.

 

一般开发人员会使用一些表格编辑工具(比如Excel,Access)来编辑表格,这些工具都有一些自己原始的文件保存格式(xls,mdb),我们之前的项目中,由于engine没法直接读取这些格式,需要由填表人员把这些原始格式的文件手动转化成文本格式(txt),这在流程上多了一个环节,比较不方便.

 

所以我考虑在engine中增加直接读取这些原始格式的功能,在项目开发阶段,engine将首先读取这些原始格式文件,并把它转成文本格式文件,再把这些文本格式文件读到内存里来,转化成游戏用到的资源.而在正式发布的游戏程序中,我们将跳过第一步,直接读取文本格式文件到内存.这样既能保证在开发期间的便利性,也能保证在产品期的游戏程序的载入速度.

 

但是读取这些原始格式的文件远没有想象的那么简单.
*.xls和mdb都可以作为数据库的data source,所以一开始我就打算使用数据库的读取方式来读它们,我选择了ADO
*.进行了用ADO读取mdb文件的尝试,找了些ADO的代码,很顺利的读进来了.
*.但是在资源热加载时却发生了问题,Access保存的时候,居然并不立即写到文件里去(天下还有这种软件),只有在关闭Access的时候,才保证作最终的写入.所以放弃了mdb文件
*.幸好还有Excel
*.Excel没有怪毛病,保存后,立即就写文件了,资源热加载的问题解决了
*.但又有新的问题,当我们用ADO尝试去打开某个xls文件时,如果这个文件正在Excel中编辑,会导致ADO读取速度非常慢.也就是说这样就无法一边修改表格一边在编辑器中观察效果了.
*.令人挣扎的问题,用ODBC试了试,一样的结果
* 不得已使出绝招,不直接去读这个正在编辑的xls文件,而是把这个xls文件复制一份,然后用ADO去读这个副本.反正只在开发期会需要这个步骤,所以可以容忍
*.It works.
*.然而又有新的问题,数据库接口在读取xls文件时,同一列中的数据类型要求一致,比如某一列的第一行是一个数字,数据库在读取时会认为这一列都是数字,如果这一列的其它行上有字符串 数据的话,它们全部被当成一个错误的数据读出来.
*.在尝试了一番后,最后承认失败
*.以上就是我和数据库斗智斗勇的过程,希望对你有帮助.
*.最终我在codeproject上找到一套代码,它可以解析excel的文件格式,从中提取出我想要的字符串来.
*.(不过这套代码最大的文件居然有6000多行,是原来项目中最大的文件的两倍,不得不说世界上没有完美的事情)

 

这回就说到这里,最近正在写材质扩展方面的东西,下回说说这个,如果能写完的话.

 

最后祝各位新年快乐!

 

 

 

posted on 2011-01-02 23:26  ixnehc  阅读(1705)  评论(4编辑  收藏  举报