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左右,有点接受不了。。。


