最有效的方法从一个DisplayObject在as3中删除孩子?(内存)



从内存和垃圾收集方面来看,从精灵/电影剪辑中删除子元素的最有效方法是什么?

我至少看到了三种方式。

简单re-assigment

sprite = new Sprite();

null和new

sprite = null
sprite = new Sprite();

或while删除(这是我喜欢的)

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

我只是学习关于干净和良好的内存管理,任何有效的输入将不胜感激,谢谢。

removechilchild或removeChildAt实际上并没有从内存中删除精灵或任何其他显示对象,它只是从显示列表中删除它。这意味着如果你创建了1000个精灵并将它们添加到舞台(显示列表),然后对所有1000个精灵使用removeChild,它们可能仍然永远存在于内存中。

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

如果你真的想删除它,只要空它,并检查这些东西:

  • 使用removeChild或removeChildAt从显示列表中删除它
  • 删除所有附加到剪辑的eventlistener。
  • 如果你在数组,向量,字典或任何其他对象中使用引用,将其从对象中删除,将其设置为null或使用Array.splice()进行拼接
  • 设置对象= null

你可以使用像EventManagedSprite这样的解决方案,它使用EventRemover使完全删除对象变得更容易。这对更大的项目也很有帮助。

如果你想重用精灵/对象,但是你想回收对象,你应该使用对象池。关于AS3的对象池的更多信息:

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

根据我的经验,removeChild + null赋值是删除DisplayObject和节省内存的最佳方法。

欢呼,

最新更新