关于性能方面的问题

因为在开发微信小游戏,为了让一些低端机也能流畅运行,特此在这里问一些性能相关的问题。
1.node.getComponent性能消耗大不大?
2.我会频繁创建并初始化一些物体,比如说射速很快的子弹。有什么好的解决方案吗?我已经用了节点池,也预加载了几个,性能有了明显的提升。不过我看到有人说用nodePool也会频繁操作node.addChild跟remove,会刷新节点树什么的,这里有人能解说一下吗?
3.如果在微信小游戏中会有频繁播放的音效,有什么解决的方案吗?用cocos自带的cc.audioEngine会很卡。
4.项目的分辨率设置成什么比较好?我现在都是竖屏设置成1080X1920。
5.node.active 的设置都会影响一些什么?有人说不显示的把它移动到屏幕外面,或者说把透明度调成0,这样就不会渲染。但是我又看到有人说,这样做在PC上正常,但是在安卓机上还是会卡爆。有这种情况吗?我如果想隐藏一个物体(后续还会显示),到底用什么方法比较好呢?

3赞

马克一下,我也想知道

竖屏我设640*1136

官方推荐分辨率 720X 1280.
node.active 算是性能消耗最小的 显示/隐藏节点的方式.
节点add/remove 消耗可以忽略不计. 放心大胆的使用nodepool 吧. 子弹类游戏不缓存节点将是灾难.
音效 播放 一方面要把音效audioClip 做好缓存复用. 一方面可以在 async function(){}中调用 play().
getComponent()消耗较大. 波动也较大. 从实际chrome上调试监控可以发现 消耗在1-50ms之间 波动很大.
addComponent()消耗波动也较大. 慎用. 最好是在ide中就添加好组件.

补充下,1.9的版本时候,node.active开销很大,说是会遍历当前节点树,比opacity这些要大很多,做过测试。2.0好像说是改了这块,但是没做具体测试了。

1、node.getComponent的性能,循环50000000次进行getConponent的消耗:

for (let index = 0; index < 50000000; index++) {
var node = this.mNode.getComponent(cc.Sprite);
}

279ms
280ms
284ms
275ms
277ms

average:279ms
(creator:2.0.2)

对于正常项目来讲,只要业务逻辑合理,个人觉得这一块可以忽略。

2、频繁创建并初始化一些物体,使用cc.NodePool就行,结合prefab,unuse, reuse 函数做好。
至于nodePool也会频繁操作node.addChild跟remove,你可以看CCNodePool.js里的代码

cc.NodePool本质也就是个数组put的时候会remove但不会clean,调用注册的unuse,然后push到数组中
get的时候,从数组中pop一个,然后调用reuse,并return给使用者。

所以addChild和remove肯定是会频繁调用的。

我改了一个官方示例测试了一下,每一帧发射10个node出来,

用的是2.0.2,打包成微信小游戏试了一下,性能还是很不错的,跟之前1.9的时候相比还是有优化的。Create Node稳定在2500出头一点,帧率稳定60帧。
至于你说的射速很快的子弹,我觉得和这个差不了太多吧,我个人觉得使用nodePool就是不错的一个解决方案了。

3、频繁播放音效的话,一般我会在场景preload的同时,将场景中频繁会用的一些音效也preload进去,当不会频繁使用这个音效的时候,再uncache掉

4、项目分辨率看你们自己定的标准吧,几年前我们都是640960的,现在改成7201280的,做好自适应这一块问题不大

5、active的设置影响的地方建议看下CCNode.js里面_onPostActivated方法你大概就知道做了什么,主要就是针对action,event,render做pause或者resume。
隐藏一个物件等待后面再次使用的话,要看你这个物件是什么,拿来做什么,有什么特点。具体情况具体分析,不存在通用做法,毕竟每个项目的需求都不一致。有些时候适合用active,有些时候可能opacity设为0后,注销event又较为合适,

7赞

谢谢这么详细的回答!

请问大佬,音频的话你是用cc的audioEngine还是微信原生的createInnerAudioContext?

mark 一下