creator:3.3.2
2d射击类游戏,需要创建很多子弹,而且子弹需要同时保留在场景里,每一个子弹的结构如下:
父节点:rigidbody2d和collider2d
子节点:一张图,一个拖尾,一个粒子(粒子是particlSystem添加了uimeshRender)。
目前的情况是每个子弹drawcall+3,想教论坛大佬,有什么方法可以优化下,非常感谢。
首先,你的游戏里同屏存在多少子弹?粒子的复杂度如何?目前的性能如何?
btw,如果你想要降低子弹的 Drawcall,可能需要做节点分层。
感谢回复,不好意思,没有说清楚。
1 同屏存在的子弹数量理论上没有上限,游戏是无尽的;
2 粒子的复杂度,我不清楚怎么描述。普遍的粒子持续时间为0.5s,最大粒子数量10,循环播放,粒子生命周期0.1,大多数粒子有单独的粒子材质;
3 目前使用的机器如下,chrome测试,32个子弹,帧率20,renderTime:20ms+,drawcall102(包含ui和其他的的25个)。
我不信,小小屏幕能显示同时多少个?不在可视范围的不需要渲染,但是保留逻辑。
这个无解,如果能用 GPU 粒子就尽量用上吧我觉得
这有点离谱,这么卡吗。。。
renderTime 20ms 左右的话怎么都不止 20 帧吧,是不是你的逻辑代码耗时太长了?
这个帧率有点离谱啊,还是先排查下哪里消耗的吧
dc102,节点32,这种肯定不会掉帧的呀
godot在做2d还是有一定的优势,但是企业用得较少
不好意思,回复略晚。
1 所有的子弹都是在屏幕可见范围内,上左右都有墙体,子弹在屏幕内反弹。
2 GPU粒子只能使用特定的材质,而且有UImeshRender的情况下,开启GPU会报错
3 下图是一张截图,gameLogic和physics也有,但是现在感觉不是主要影响因素
感谢回复,节点数一共不是32,只是单纯的子弹32个,每个子弹有2-3个子节点。游戏截图在上个回复里有,就不一一粘贴了。
感谢回复,有我自己的原因,太菜了,第一次接触,逻辑方面可能有问题
兄弟,踩了3个雷点:
- 这么大量的物理碰撞可以不用内置的物理,参考源码自己实现一套简化版,四叉树优化。
- 不能大量使用拖尾
- 不能大量使用uimeshRender
这么大量的 2D 碰撞体,是必须使用四叉树方案来优化性能的。利用四叉树方案把碰撞空间划分出来,再利用引擎内置的碰撞检测方法,在四叉树空间下手动检测碰撞。能有效减少同时加载大量碰撞体的时间、提高大量碰撞的效率。
在 3.x 版本上四叉树方案可以参考这个仓库:CococsCreator-public-technology-solutions/demo/Creator3.4.1_2D_QuadtreeCollision at 3.4.0-release · cocos-creator/CococsCreator-public-technology-solutions · GitHub
碰撞检测方法可以使用 intersect api 手动检测。多边形的碰撞矩阵可以使用多边形碰撞体的。
另外不知道为什么你要用 3D 粒子?3D 粒子相比 2D 粒子复杂度更高,内存占用更多,并且在 canvas 下还需要用 UIMeshRenderer 去转换世界矩阵,明显开销更多。
拖尾组件组件我没怎么测试过,不了解它现在的性能。但是这东西现在应该没法合批吧。如果会打断合批的话,建议不要加哦。
碰撞反弹效果可以自己利用三角函数实现,如果还需要复杂的物理效果,那就还是用 box2d 吧。参考这个方案改造一下引擎,优化 box2d 性能。
多边形碰撞体的矩阵尽量简单一点,不要太复杂,否则性能也会有影响。
主观臆断卡在cpu算物理碰撞吧,你这还没上敌机。。。建议不要用自带的物理引擎,有几个方案参考:
1.确定瓶颈,比如去掉拖尾看看帧率是否大幅提升
2.使用kdtree管理子弹和目标
3.简化碰撞算法和反弹算法
感谢回复,拖尾和粒子必须要使用的,我在找找其他的方法。碰撞我立马优化下,感谢感谢!
感谢回复,我按照大佬的建议在优化下,非常感谢!
碰撞体大多都是圆,极少数多边形
感谢回复,综合各位大佬的建议,我尝试优化一下,感谢!