动态加载prefab,plist,释放总是有残留,为什么呢

creator 1.5.1正式版本,之前版本也有问题
环境 mac , native

动态加载prefab,plist,释放总是有残留…动态加载的越多,残留越多

复现方式:
loadres 方式,加载多个plist 或 prefab,在回调里先保存一下,然后再释放,把保存的清空,内存减少,但残留一部分,多次GC也不会减少了

伪代码:
//资源预加载
preLoadRes: function (path, type){
this._preResCache = {};
cc.loader.loadRes(path, type, function (err, res) {
if(err){
cc.log(err);
return;
}
this._preResCache[path] = res;
}
}

//释放
releaseObject: function (obj, path) {
for(var key in this._preResCache){
if (this._preResCache[key]) {
if (obj instanceof cc.SpriteAtlas){
cc.loader.releaseRes(path, cc.SpriteAtlas);//???这里需不需要调用?

            let deps = cc.loader.getDependsRecursively(path);
            cc.log("releaseObject deps",deps.length,deps);
            cc.loader.release(deps);
        }
        else if (obj instanceof cc.Prefab) {
            let deps = cc.loader.getDependsRecursively(path);
            cc.log("releaseObject deps",deps.length,deps);
            cc.loader.release(deps);
        }
        delete this._preResCache[key];
    }
}

}

然后在A场景预加载,切换到B场景时释放,B场景为空场景,就是为了验证资源释放用的
现象:
内存释放会有残留,残留大小与loadres个数和文件大小有关,
调试查看,贴图都有释放,残留不知道是什么没有释放,而且每次切换场景都会固定增加,基本是固定的

发现:
调试时发现,

大约过几帧后,

srpiteframe里把texture的引用计数减成0,然后delete texture
这样,最终会删除贴图,但就是会有残留,
不知道是不是这里的删除顺序产生的问题???或者,还有什么其他不是贴图资源没有释放???
主要是多次GC都减不下去,为了测试,我每10秒GC一次都不能减少这个残留

如果有释放的好方法,否提供些信息
也请引擎开发组帮忙看看,
因为现在动态加载资源比较多,每次切换场景要残留10M左右,有点接受不了。。。

求关注~~~~~

能否制作一个简单的测试例,我看一下。

我私信发给你了,麻烦接收一下,谢谢了~~~~

哪个私信? 我怎么没收到?

发错了:3:
重新发了下,请接收~

关注,紫薯补丁

等问题解决了,我会分享给大家~~~

你观察到的结果可能不是“真实”(准确)的。。。

我刚刚用你发给我的 demo 试了一下,在 Xcode 的内存是显示一直涨的,但是这个地方并不准。(具体原因我也不知道,但是工具应该是有问题的)

如果你用 Xcode 的 profiler 去 profile 的话,你会发现 persistant memory 是会降下来的。

上图中的红色小点表示内存泄漏,这个是 spidermonkey 自身的问题,不过也有可能是工具误报。

我们在做 jsb 2.0 的时候,发现 javascript core 和 v8 用这个工具都检测不到内存泄漏,但是 TM 的 Spidermonkey 就是有红点。。。

可能是 Spidermonkey 使用了自己的内存分配机制,导致工具检测出了问题吧。

1赞

哦哦,多谢多谢,
我再观察一段时间,多谢~~

老哥,你最后解决这个问题了吗

升到1.7后好很多,你可以试一试