从as3中的DisplayObject中删除子节点的最有效方法?(记忆)

Sim*_*kie 1 memory-management actionscript-3

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

我已经看到了至少三种方式.

简单的重新分配

sprite = new Sprite();
Run Code Online (Sandbox Code Playgroud)

null然后是new

sprite = null
sprite = new Sprite();
Run Code Online (Sandbox Code Playgroud)

或删除(我喜欢)

while(sprite.numChildren > 0){   
    sprite.removeChildAt(0); 
}
Run Code Online (Sandbox Code Playgroud)

我只是学习干净和良好的内存管理,任何VALID输入将不胜感激,谢谢.

Mar*_*nol 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,但想要回收对象,则应使用对象池.有关使用AS3进行对象池的更多信息: