cocos2d-x在3D的算法方面的优化找不到太多下手的地方,尝试过几个优化方案都失败了。
之前尝试过将帧数据二分查找的部分,替换成固定帧索引的方式,因为浮点数运算会丢失精度的问题也失败了,做出来的动画会产生轻微的抖动效果
最近尝试了一下在逻辑层上优化cocos2d的3D性能,效果还可以。
思路是将游戏场景中的精灵分为两类:
- 主要精灵:比如英雄,BOSS,这类精灵的动画需要保持较高的流畅性
2 .次要精灵:比如小怪,杂兵,动态的场景等
玩家在玩游戏时大部分视觉焦点都是集中在主要精灵上的,次要精灵的动作稍微笨拙一点也是可以接受的(没办法,性能不够好)
这样在每一帧计算animation时
- 首先确主要精灵的骨骼数据在每一帧中都要得到计算
- 次要精灵的骨骼数据只需要计算一部分就行了(比如如果有10个次要精灵,那么我们可以只计算5个,甚至更低)。
- 没有计算的次要精灵的骨骼数据是不会变化的,所以在srpite3D的draw函数中也不需要计算相关的骨骼数据,直接使用上一次的数据就可以了。
- 循环计算所有的次要精灵,保证所有的次要精灵都得到计算(比如第一帧计算前5个,第二帧计算后5个)。
- 动态获取当前的帧率,根据当前的帧率调整需要计算的次要精灵的比例
通过这种方式在低性能的设备上可以保障一定的帧率,确保主要精灵的表现效果
性能测试:
测试模型:2500面,58根骨骼的模型,26个次要精灵,1个主要精灵
测试设备:低端的android设备
没有优化之前:大概5-10帧左右
优化方案1-每次计算1/2的次要精灵:大概在10-15帧左右,主要精灵和次要精灵看起来都有些卡,实际计算量为每帧15个,每间隔2帧刷新一次
优化方案2-每次计算1/3的次要精灵:大概在17-23帧左右,主要精灵的动作比较流畅,次要精灵也不太能看的卡顿,实际计算量为每帧9个,每间隔3帧刷新一次
优化方案3-每次计算1/4的次要精灵:大概在30-45帧左右,主要精灵的动作非常流畅,次要精灵能够明显看出一些呆滞,实际计算量为每帧7个,每间隔4帧刷新一次
进阶的方案里还可以给精灵划分次要等级,不同的次要精灵可以设置不同的刷新间隔,这样就可以在一个场景里容纳数量较多的3D精灵,大场面也是具有可能性的
