性能巨坑:Native版创建结点是Web版的几十倍慢

我弄了个简单的测试工程,点一下按钮会创建1000个结点,代码非常简单:

doTest: function() {
    var tm = Date.now();
    for (var i = 0; i < 1000; ++i) {
        var node = new cc.Node();
        node.parent = this.node;
    }
    tm = Date.now() - tm
    this.lbTime.string = '时间:' + tm + '毫秒';
    this.lbCount.string = '子结点数: ' + this.node.children.length;
},

然后用Web版跑了下测试,如图:

测试结果非常理想,而且我发现点多几下,后面会更快,大概是引擎内部有做一些缓存之类的。

后面是我跑了原生版的测试,结果就坑爹了:

每一次点击创建1000个结点花了243毫秒。更坑爹的在后面,我再创建1000个结点,这次的时间竟然是:

看起来效率和父结点的子结点数成正比,子结点越多,创建结点越慢,我后面再点了几下,果然印证了结果:


@nantas @panda @jare @wangzhe

原生版的创建结点值得好好优化。

2赞

NewProject.zip (510.5 KB)

我把测试工程也放上去了,希望官方有空看看,现在我们的安卓版本打开界面慢得令人发指

我自己也在Profile,如果有进一步消息会发上来,当然主要还是得引擎组的人看看

1赞

同样关注~~~~~

原生端panda老师在进行升级了 ,另外在1.4的时候对生成节点进行了优化,推荐使用复制节点来生成
instantiate ( original ) Object
复制给定的对象

Instantiate 时,function 和 dom 等非可序列化对象会直接保留原有引用,Asset 会直接进行浅拷贝,可序列化类型会进行深拷贝

关注关注~~~

上面例子性能热点明显是在原生引擎的一些处理上,我晚上的调试发现有两个地方严重影响性能:

1。在Node::postInsertChild里面,有如下代码:

if (_cascadeOpacityEnabled)
{
    updateCascadeOpacity();
}

每插入一个结点,就会调用一次updateCascadeOpacity,而这个函数就递归遍历子结点,设置他们的Opacity。
问题在于,这个时机没有必要调用这个函数吧,只需要设置子结点的opacity就行了呀?

把这个去掉之后,由原来的242减到了120左右 ,但每次点击还是会增长时间。

2。在Node::insertChild里面有一段代码:

#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
    auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
    if (sEngine)
    {
        sEngine->retainScriptObject(this, child);
    }
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS

我把它注释掉之后,时间变成了70左右,且再也不会增长了。这段应该是会自动管理原生对象的生命周期的吧?

看起来,这里原生的坑还是不少的。

6赞

楼主有心了,持续关注

赞一个

哥们,你比我好多了,我做像素画游戏,创建5000个格子,接近20秒才进去的,然后我想提高分辨率,创建了50万个格子,就没有进去过。等了半天程序崩溃了

50万。。。每一个像素都是一个格子么

你该更换实现方式了,不能一个格子一个结点

楼主:+1: 关注~~~~~

这个我也碰到了。
如果第一次进入场景load 1000个节点,时间是1秒的话。
退出后,内存正常释放
第二次再进入场景,时间是1秒+n秒!
n的时长跟进入场景的次数有关!

于是进出10次场景以后,明显感觉,越来越慢,越来越慢。

用户玩你的游戏关卡,玩到第十关,要开始抱怨了,玩到20关,就可以先去点支烟了。
这是超级巨坑啊。

感谢楼主测试和反馈,JSB 的性能问题正在解决。

针对其中一个优化点提了一个PR,希望你们审查一下:
https://github.com/cocos-creator/cocos2d-x-lite/pull/640

2赞

这个现象我们也遇到了

请问,楼主调试的方式是?
我们也在做优化, 目前对于时间消耗的采集没有一个很好的方法.

支持一个!

顶一个。、。。。。。。

我也发现这个问题了。WEB上打开界面快,在android上有点卡卡的。。顶起来