最近这项目老是内存泄漏,很窝火,后来发现总有资源回收不干净,发现了一些问题,写了个小示例,麻烦官方大佬看一下
recycle1() {
var myscene = new Laya.Scene3D;
Laya.Sprite3D.load("Models/Ball.lh", Laya.Handler.create(this, function(sp){
for(var i=0; i<3; i++){
var ball = myscene.addChild(sp.clone());
ball.name = i.toString();
}
console.log("add finished: ", myscene.numChildren);
for(var i=0; i<myscene.numChildren; i++){
console.log(myscene.getChildAt(i).name)
myscene.getChildAt(i).destroy();
}
console.log("recycle func1 finished: ", myscene.numChildren);
}))
}
recycle2() {
var myscene = new Laya.Scene3D;
Laya.Sprite3D.load("Models/Ball.lh", Laya.Handler.create(this, function(sp){
for(var i=0; i<3; i++){
var ball = myscene.addChild(sp.clone());
ball.name = i.toString();
}
console.log("add finished: ", myscene.numChildren);
for(var i=0; i<myscene.numChildren; i++){
console.log(myscene.getChildAt(0).name)
myscene.getChildAt(0).destroy();
}
console.log("recycle func2 finished: ", myscene.numChildren);
}))
}
recycle3() {
var myscene = new Laya.Scene3D;
Laya.Sprite3D.load("Models/Ball.lh", Laya.Handler.create(this, function(sp){
for(var i=0; i<3; i++){
var ball = myscene.addChild(sp.clone());
ball.name = i.toString();
}
console.log("add finished: ", myscene.numChildren);
for(var i=myscene.numChildren-1; i>=0; i--){
console.log(myscene.getChildAt(i).name)
myscene.getChildAt(i).destroy();
}
console.log("recycle func3 finished: ", myscene.numChildren);
}))
}
如上,三种资源回收的方式的输出结果如下:
add finished: 3
0
2
recycle func1 finished: 1
add finished: 3
0
1
recycle func2 finished: 1
add finished: 3
2
1
0
recycle func3 finished: 0
可以明显看出,只有第三种反序遍历清理的方式能清除干净。
仔细看了引擎的代码,引擎在很多资源回收的地方使用了1和2的方式,还有使用for in遍历的方式回收的,麻烦大佬确认一下是否有问题。
附件:
recycle.jpg