[LayaAir 2.0]Laya.loader.clearTextureRes引起的内存泄露以及恢复图片显示闪烁

1、引擎和ide版本都是2.1.2
2、点击屏幕会绘制一个光圈特效
3、点击第1次加载资源使用后释放调用Laya.loader.clearTextureRes
4、再点第2次
     1、图片代码中指示出必然会进入多次,导致重复加载了图片,内存这一刻无法释放。
     2、画面中的本次点击的特效会闪烁,猜测上面的图片地址错误导致多次误刷新。
5、之后点击正常,内存和显示都正常
1584186646(1).png
已邀请:

layabox

赞同来自: charley

首先,DEMO中的操作是错误的,在DEMO中,开发者使用了clearTextureRes()来清理资源。而clearTextureRes()方法只会销毁texture使用的图片资源,但会保留texture资源壳,在下次渲染的时候,发现texture使用的图片资源不存在,则会自动恢复图片资源用于显示。所以才导致问题的产生。开发者自己的解决方案,仍然存在隐患,通过遍历图集信息恢复资源,首先有些图集是一个json对应多个合并的图,这样会漏,然后图集是不会合并图的,只有个路径映射信息。这样加载也会有问题。还有就是Texture只能恢复自己的对象,不能恢复图集所有texture对象,导致设计不合理。因为这个特效是复用的,建议不要这样清理,经常清理反而没什么效果。退出的时候做一次总的清理就行,现在是播完一次就清理一次,没有必要。闪一下的问题,不太明显,不过大概的原因是,由于清理了资源再去用,会有一个异步加载的时间。最后是建议使用新版引擎。

Aar0n

赞同来自:

这个版本很早了,这块的问题新版是有修正的,请尝试一下新版引擎,或者对比引擎库 按新版修改一下

wade2020

赞同来自:

感谢回复。能麻烦告诉下是哪个版本改好了的?如果改动不大,能不能告知下是哪几处,目前我没办法再往上升级了。

wade2020

赞同来自:

自己解决了,希望官方能重视这个问题,因为目前我测试到的引擎库都有这个bug。
代码如下:
            Laya.loader.load(this.skPath.replace(".atlas",".png"),Laya.Handler.create(this,function(bit){
                var arr = Laya.Loader.getAtlas(this.skPath);
                arr.forEach(resUrl=>{
                    var tex = Laya.Loader.getRes(resUrl) as Laya.Texture;
                    tex.bitmap = bit;
                });
                this.onResLoadFinish(bit);
            }),null,"htmlimage",1,false,null,true);

要回复问题请先

商务合作
商务合作