从内存和垃圾收集方面来看,从精灵/电影剪辑中删除子元素的最有效方法是什么?
我至少看到了三种方式。
简单re-assigmentsprite = 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和节省内存的最佳方法。
欢呼,