本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html
公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一直”处于马上发布准备大推的阶段,没人敢动。恩,公司的骨骼动画貌似是用Flash做然后通过插件导出成 plist、png、xml格式的,现在,大项目负责人说骨骼动画卡,要优化,恩,交给我来做~~~
前期分析
通过耗时比较,90%的时间消耗在了 CCDataReaderHelper::addDataFromCache 这个方法里,其中90%的时间又花在 CCDataReaderHelper::decodeAnimation 这里。一看xml文件:3M多,25600多行,其中 animation部分有25000行。。。通过层层筛选分析,得出结论:xml文件过大导致xml树节点过多,最终导致遍历xml树构建 CCArmatureData、CCAnimationData、CCMovmentBoneData、CCFrameData等数据时消耗过大,其中遍历xml树时的查询也是比较耗时的一个环节。
方案选择
在涉及到文件的优化方式里,序列化一直是考虑首选。查看了 CCBoneData、CCFrameData的类之后,发现它们的数据成员除了 name 是string之外 其他的都是 int、float、bool,挺好的,比xml优化那时的满地字符串好多了,成员name可以用char[],大小固定64差不多了,就这样愉快地决定了用序列化来优化。
大概思路
CCArmatureData、CCAnimationData等几个类的关系是:CCArmatureData->CCBoneData->CCDisplayData; CCAnimationData->CCMovmentData->CCMovmentBoneData->CCFrameData; CCTextureData->CCContourData->CCContourVertex2,组合关系用了CCDictionary和CCArray。定义一系列struct和上面那十个类一一对应,如 arm_struct、ani_struct等,把类的数据都存到struct里,然后把struct直接写到文本;加载的时候就读文本,把数据写到struct里,然后根据struct构建出CCArmatureData等数据。
细节实现
CCArmatureData等类和struct之间转换时怎么实现呢?深度优先和广度优先二选一,由于CCArmatureData等类之间的关系是包含关系,就是一棵树,深度优先会更好一点。
骨骼数据转struct:(本来写了很多的,但又删了,还是代码说得清楚点)
1 struct CC_DLL skeleton_struct 2 { 3 char name[64]; 4 float version; //version 5 int childCount_arm; 6 int childCount_arm_b; 7 int childCount_arm_d; 8 int childCount_ani; 9 int childCount_ani_m; 10 int childCount_ani_b; 11 int childCount_ani_f; 12 int childCount_tex; 13 int childCount_tex_con; 14 int childCount_tex_vt; 15 16 //float frameRate; //no work yet? 17 }; 18 19 20 // CCArmatureData 21 struct CC_DLL Armature_struct 22 { 23 //有多个struct_Armature_b 24 char name[64]; 25 int child_count; 26 int child_index; 27 }; 28 29 30 // CCBoneData 31 struct CC_DLL Armature_b_struct 32 { 33 //有多个struct_Armature_b_d 34 35 // BaseData_struct baseData;//只用到了 只Order 属性 36 char name[64]; 37 char parentName[64]; 38 int child_count; 39 int child_index; 40 int zOrder; 41 }; 42 43 44 // CCDisplayData 45 struct CC_DLL Armature_b_d_struct 46 { 47 char name[64]; 48 int displayType; //displayType base on this gay 49 // int child_count; 50 // int child_index; 51 52 //float pX; //no useed in cocos2dx 53 //float pY; //no useed in cocos2dx 54 };