一起来聊聊性能优化的问题呗?

我还是那个才学,然后又是在做贪吃蛇的人呀,可视区域外的身体和食物的节点处理我用的是active,但是这样真的好么?有没有更好的方案了呀?感觉有点计算量大呀

不要用 active,这样会导致节点树 dirty,会重新 visit,建议把看不到的身体和食物的位置设置到 visibleRect 之外,然后需要的时候再设置回来,这样可以大大提高 web 上面的渲染效率。

1赞

修改 visible,或者动态添加或删除节点都会导致节点树重新遍历,这个是很耗 cpu 的。

2赞

设置opacity为0呢。会不会更好一点。

你的意思,我在外面套一个Mask,它会自动裁剪外面不在这个里面的节点?

我之前好像有这样试过,以为会为渲染,但是好像是会有大量计算的

这是我刚做的测试 背景上面的小点有800个,已经掉帧到40左右了- -不过我用的是微信浏览器,这是合理的么?

设置 opacity 为 0 会好一点,不过 creator 里面放置在屏幕外的节点也会被 culling,其实差别不是很大。

1赞

iOS9 在微信浏览器上面是强制使用的是 canvas,渲染性能比较差。

800 个小点是 sprite,还是 drawNode,还是 graphics?

建议用 graphics,sprite 在 canvas 上面的变色性能会非常差。

drawNode 不建议使用。

话说cc.visibleRect 怎么用啊,研究了半天,没发现怎么用,如果只是设置透明,那我直接自己计算长宽,超过就直接改透明度就完了?这样真的会减少渲染的计算?

sprite我用的是这个,然后预置的,我看看这个graphics

我食物点可以这么处理

那身体呢,身体肯定是图片资源的

opacity=0相当于active=false用。 opacity==0时你就不去算了员。主要是不让节点树重新遍历

这样有大量的节点只是不渲染了,但是隐藏在场景中,没影响的?

其实这个相当于对像池。隐藏了的节点就相当于放进了对像池中。因为现在acitve addchild都会有比较大的消耗。这个能降低这一块的消耗。不过你还是主要考虑子龙老大的方案吧。opacity我也没用过。

好的,谢谢,我先试下,

这个是什么测试软件?

var ctx;
ctx = self.gameMapGraphics.getComponent(cc.Graphics);
for(x = 0; x < 200; x++){
coordinate = self.gameMap.convertToNodeSpaceAR(cc.v2(Math.random() * (self.gameMap.width - 400), Math.random() * (self.gameMap.height - 200 )));
if(Math.random() < 0.5)coordinate.x = coordinate.x*-1;
if(Math.random() < 0.5)coordinate.y = coordinate.y*-1;
ctx.circle(coordinate.x / 2,coordinate.y / 2, 6);
ctx.fillColor = {r: Math.floor(Math.random()*255), g: Math.floor(Math.random()*255), b: Math.floor(Math.random()*255), a: 255};
}
ctx.fill();

这样真的好么,性能真的在微信上面是起来了,但是这三千多个精灵点,确定没啥事么,我不明白为啥会出来三千多,我只循环了200次呀

还有就是,我画出来了,我怎么对其中的某一个点进行移动- -好像压根找不到这个点,全是画在一个画布上的

我一直以为让node设置成active = false会比较省资源,这篇看一看反而是相反的,所以是让opacity为0会比较好吗,还是说用enable会再好一点?

所谓屏幕外是指将物件丢在canvas所设置的范围之外吗?假如有多个物件横跨在可视范围和可视范围外,对效能会不会有什么影响?

所以总归来讲,用哪种方式会比较好?
有什么比较好的测试效能软件可以推荐吗?
新手问题有点没深度QQ

其实也就是几句话的优化问题罢了,只是官方没有一个地方放出来,只能全 靠自己去踩坑,这就特别坑新人了,我之前也问过,他们说是active要省点,我还问了有没有更好的方案,然后没人回复了,现在又说丢可视外面,我又在想,这样不会占用很高的内存?GPU是省了,内存怎么整呢

目前在编写动画时主node都不会随便让他active = false。
可是子node的部份却一直在滥用,只是因为以小游戏为主,所以目前Web版还不太有延迟的问题,我想是因为子node本身影响的节点不多的关系?

不知道如果把active = false的部份全修正掉会不会让效能再好一些?