动物餐厅项目内存优化思路分享

autoReleaseInstantiate这个方法的作用就是实例化,禁止用这个方法拷贝节点,只允许用来实例化prefab

明白了,那你忙拷贝节点,还是用老的么?

文里写了,不允许拷贝节点,不太准,应该是不允许拷贝没有 AutoRelease 组件的节点

多谢答复!

您好,有个问题想请教下。比如说预制体上有个滚动层,有个节点,这时需要循环拷贝这个节点加入滚动层里,并且更换节点上的贴图,按照思路上说的,用autoReleaseInstantiate实例化prefab,这个时候节点上贴图的计数+1,循环拷贝节点的时候用的cc.instantiate,资源计数没有加1,但是更换节点贴图,旧资源的计数先减1,新资源计数+1,这时候旧资源的计数势必小于0了,这样是不是就有问题了。。。。不知道我的理解对不对。。。还望解答。。

日常查看大神作品

不要拷贝节点,用 autoReleaseInstantiate 实例化 prefab,而且为啥不复用之前的节点而是循环拷贝节点?

小小的挖个坟。。autoReleaseInstantiate这个api在哪。。为啥api文档搜不到。。

mark!!!

那是他们自己封装的~

感谢大佬提供的思路!

请问大佬,对于动态替换资源要如何正确的引用计数?
如果只是按照你说的老资源计数- 新资源计数+,那么 假设 PrefabC静态引用了SpriteFrame A, 这时替换成动态加载的SpriteFrame B,A的引用-1,B的引用+1,此时的A引用为0,B的引用为1, 如果C销毁掉,那么A的引用是不是为-1了?

A都没引用了,为什么还要-1?

销毁的时候是遍历子节点引用的资源减引用的(之前web 看的时候是这样),所以不会去减少没有引用 A 引用计数

autoRelease脚本传入的是prefab 本身,在onDestroy的时候是会减少A引用的。

哦对,我记错了,释放的是 asset 类型,但是

    public decRef (autoRelease = true): Asset {
        if (this._ref > 0) {
            this._ref--;
        }
        if (autoRelease) {
            legacyCC.assetManager._releaseManager.tryRelease(this);
        }
        return this;
    }

tryRelease接口 在2.3版本貌似没有 :joy:,只能非常正确的管理引用

mark~~

2.4的资源管理模式 是否还适用这个方案呢?

mark!