从as3中的显示对象中删除子节点的最有效方法? (记忆)

时间:2011-08-14 10:01:42

标签: actionscript-3 memory-management

在内存和垃圾收集方面,从sprite / movieclip中删除子节点的最有效方法是什么?

我已经看过至少三种方式。

简单的重新分配

sprite = new Sprite();

null,然后是新的

sprite = null
sprite = new Sprite();

或删除时(我喜欢)

while(sprite.numChildren > 0){   
    sprite.removeChildAt(0); 
}

我只是在学习清洁和良好的内存管理,任何VALID输入都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:5)

removeChild或removeChildAt实际上并没有从内存中删除Sprite或任何其他DisplayObject,它只是从displaylist中删除它。这意味着如果您创建1000个精灵并将它们添加到舞台(displaylist),然后在所有1000个精灵上使用removeChild,它们仍然可以永久存在于内存中。

要从内存中删除它,应在所有引用对象中将其设置为null。

如果你真的想删除它,只需将其置空并检查以下内容:

  • 使用removeChild或removeChildAt
  • 将其从displaylist中删除
  • 删除附加到剪辑的所有eventListener。
  • 如果您在Array,Vector,Dictionary或任何其他对象中使用了引用,请将其从对象中删除,将其设置为null或使用Array.splice()
  • 将其拼接
  • 设置object = null

您可以使用像EventManagedSprite这样的解决方案,它使用EventRemover来更轻松地完全删除对象。这也可能对更大的项目有所帮助。

如果要重新使用sprite / object,但想循环使用回收对象,则应使用对象池。有关object pooling with AS3的更多信息:

答案 1 :(得分:1)

removeChild / removeChildAt从其父级移除DisplayObject;它仍然保留在内存中,如果你愿意,你可以稍后添加它(只要你有参考它)。

根据我的经验,removeChild + null赋值是删除DisplayObject并保存在内存中的最佳方法。

干杯,