3d性能优化方案,智能跳帧系统

cocos2d-x在3D的算法方面的优化找不到太多下手的地方,尝试过几个优化方案都失败了。

之前尝试过将帧数据二分查找的部分,替换成固定帧索引的方式,因为浮点数运算会丢失精度的问题也失败了,做出来的动画会产生轻微的抖动效果

最近尝试了一下在逻辑层上优化cocos2d的3D性能,效果还可以。

思路是将游戏场景中的精灵分为两类:

  1. 主要精灵:比如英雄,BOSS,这类精灵的动画需要保持较高的流畅性
    2 .次要精灵:比如小怪,杂兵,动态的场景等

玩家在玩游戏时大部分视觉焦点都是集中在主要精灵上的,次要精灵的动作稍微笨拙一点也是可以接受的(没办法,性能不够好)

这样在每一帧计算animation时

  1. 首先确主要精灵的骨骼数据在每一帧中都要得到计算
  2. 次要精灵的骨骼数据只需要计算一部分就行了(比如如果有10个次要精灵,那么我们可以只计算5个,甚至更低)。
  3. 没有计算的次要精灵的骨骼数据是不会变化的,所以在srpite3D的draw函数中也不需要计算相关的骨骼数据,直接使用上一次的数据就可以了。
  4. 循环计算所有的次要精灵,保证所有的次要精灵都得到计算(比如第一帧计算前5个,第二帧计算后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精灵,大场面也是具有可能性的

方案不错,感觉呆滞,应该 是你只是隔帧刷新,
但是精灵刷新的时间,还是当前帧时间间隔,动作就慢了
应该传实际隔帧总时间和,传给精灵,这样动作会合理一点

建议你把骨骼数降低到40以下,58根骨骼默认会是两次drawcall。
另外,新版本中可以设置动画质量(你用的版本可能还不行),低等级的动画质量计算量小,效率会提高些。

“另外,新版本中可以设置动画质量”
请问这个在哪里可以设置呢,我看了Sprite3D,Animation3D的api并没有找到

将来会提供一个类似 setQuality 这样的接口到CCAnimate3D中,然后你可以设置动画质量等级,目前你的版本还没有。

做了一下测试,发现setQuality,加载30个2700面的模型,60多骷髅,居然发现帧数基本没有变化,那这个优化有何意义?

这个是CPU端的骨骼插值计算的质量,low是不插值,直接用相近的关键帧,能省些电,对CPU的overhead有用。
你这个可能是GPU已经overhead了。

楼上正解:2::2::2:

看了源码了,这点计算量太小了,计算3个或4个的数据,与拷贝一下内存,相对于计骨骼矩阵来说,感觉可以忽略掉了,而且这样会降低品质

你这方面的优化官方还没出,不过应该后面也会出,游戏背景和人物的刷新频率肯定是不一样的,包括后面应该还要出光影的烘焙等,这些功能。