cocos2d-x-3.4版本3D渲染性能实测试

Hi 各位

昨天对cocos2d-x的3D性能提出了疑问,今天就干脆在真机上做了一下性能的测试,给大家分享一下测试结果

先来一个总结:cocos2d-x的性能瓶颈还是在自己的架构上。

测试设备:
小米4手机一部:作为中端设备参考
三年前的sony手机一部:作为低端设备参考

测试模型:2500面,58根骨骼的模型,26个,参考示意图3

测试场景1:不播放动画,只测试渲染性能
小米4::35-40帧左右
sony:20-25帧左右

测试方法:在scene的render方法中测算每一帧中visit函数与 renderer->render();的耗时情况

void Scene::render(Renderer* renderer)
{
前略****

 for (const auto& camera : _cameras)

  {  
           ***********************
       visit(renderer, transform, 0);
       renderer->render();
       ****************************
 }
****************************************

}

测试结果:
WIN平台:visit的耗时与render的耗时基本是对半开,各占50%
Andrid:visit的耗时通常是render耗时的10倍,渲染实际上是不怎么花时间的(0.001-0.003),这可能是CPU性能差的原因,但是无疑也指出了每一帧花费在框架上的计算量过大的问题(0.01-0.04),下面有2张性能截图可以查看一下实际数据
PS:图1为小米4性能截图,图2为sony性能截图

测试场景2:在测试1的基础上,播放动画(开启骨骼的计算)
小米4::15-20帧左右
sony:5-10帧左右
可以看到骨骼计算的性能是灾难性的,直接能让性能掉一半,翻看了一下骨骼动画的计算代码,除了大量的数学计算外,在查找帧序列时使用的是查找算法,虽然是使用的二分查找,但是如果帧序列过多的话,依然会有很多的性能开销。

看来cocos团队还有很长的路要走,性能问题不能及早解决的话,谈何商业化呢。希望cocos团队继续加油,早日完善引擎

最后吐槽一下3.0的新架构,刚从2.0转到3.0的就非常不适应,虽然3.0的架构看起来更加优美一点,但是感觉实用性大打折扣。
尤其是新的command机制给追踪调试增加了难度,额外命令和排序管理增加了性能的开销。
这个跟我个人的编程风格有关系吧,我一向看重实用大于优雅。所以想吐槽一下

新放出来的3.5也做了一些小改动,个人也是感觉可有可无的修改,比如3.5在win平台编译时,现在会将资源拷贝debug目录下,其实这样的改动对开发者来说是没什么意义的。反而会造成一些小问题。比如开发者从3.4升级到3.5的时候就不能只替换cocos目录就OK了,必须重新用3.5创建一个项目,使用新的sln,

因为不知道cocos的整体计划是怎么样的,单从这个小问题来看吧,个人觉得就是为了优雅而优雅的工作。其实cocos频繁的变化也是众多开发者诟病的地方。

cocos团队就这么几个人,希望把有限的精力放到完善核心模块上吧,这个才是大家关心的根本

1赞

支持楼主这样的测试!!

就编辑器来讲,能操作3D的东西就很有限。感觉离商业应用还很远啊

1024个赞:2:
感觉真机测试的时候,就感觉蛮卡的。还以为手机上的3d就是这么卡呢。:8:

性能确实不行啊···

谢谢楼主。。。

人物模型不错= =哈哈。

有没有试过新加的 PU 粒子的播放. 你放多了 就看那帧数 掉的 哗啦哗啦的 60 掉到 30也是有的. 需要一个基准啊.

感谢您的测试,吐槽和建议。

已转引擎组。:2::2::2:

今天继续研究了一下Animation3D

性能瓶颈主要出现在两个地方
1.寻找帧时的二分查找算法
2.球面插值算法

二分查找算法,我修改成固定真查找算法了,就是在创建Animation的时候把每一帧的数据和它所对应的下一帧数据都创建好,没有帧数据的节点,进行插值填充。在update的时候直接通过 “当前时间”/“单帧时间" 来获得当前帧的索引,然后取值计算,避免了查找
实验了一下这种方案能够提升大约10%左右的性能。

球面插值算法没研究过,啃不动,但是看到里面有大量的计算,这里的性能开销是很大的,希望能想办法优化一下

算法上的优化我没太多精力搞下去了,打算做一个智能的跳帧系统,让那些不太重要的精灵可以智能的跳帧,这样空一些计算量出来

开armv7a了吗

Hi, 没有设置过这方面的参数,也不明白这方面的参数怎么设置,这个要怎么处理,请指教

Application.mk中加上ABI := armeabi-v7a

或者运行android-build.py时加参数 -n APP_ABI=armeabi-v7a