本文原链接: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 };
View Code

相关文章: