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

同样关注~~~~~

原生端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上有点卡卡的。。顶起来

已经对现有cocos版本做了改动,效果还不错

老铁,任天堂当年的像素游戏要是这么做,红白机能带动吗。。