闪存是否足够智能以“隐藏”不在舞台上的 PIXELS,以减少内存使用?或者我必须手动完成,如果它完全减少了内存使用量?
3 回答
Flash 不会渲染不在舞台上的对象(根据http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e3e.html)。
但是,我认为您可能混淆了两个不同的问题。
一个问题是 CPU/GPU 性能 - 为此无需担心舞台外对象,因为 Flash 不会浪费时间渲染舞台边界之外的显示对象。
另一个问题是内存使用。您创建的每个对象都会占用一些内存,无论它是否在屏幕上可见。Flash 有一个垃圾收集器,它会定期处理未使用的对象,但是“未使用的对象”是指未被任何其他对象引用的对象,因此如果您遇到内存问题,您将不得不通过删除事件侦听器来手动清理对象,归零引用等
没有类似的方法可以减少内存使用量。如果它在您的显示器上可见,则需要由 Flash 渲染并在内存中存储像素颜色。
尽管 Flash 现在非常快,尤其是在硬件加速方面。因此,您不必太担心性能,AS3 为您的虚拟降压带来了很多好处。我会赌上我所有的虚拟美元。
Flash 将按预期将所有位图、movieclip 实际上所有对象存储在内存中。如果你有一个比舞台大的位图,它仍然会占用内存,不管你只显示它的一部分。
如果您有多个位图或影片剪辑可能会移出舞台并且其中没有一部分是可见的,那么恢复内存的唯一方法是确保取消引用对象并将其设置为 null。
myMovieClip = null;
在设置为 null 之前,您还必须确保没有其他对象引用该对象,例如它不能存储在数组中或附加任何事件侦听器,因此:
myMovieClip.removeEventListener(Event.WHATEVER, eventHandler);
对于 bitmapdata 对象,您需要在设置为 null 之前先调用 dispose:
myBitmapdata.dispose();
myBitmapdata = null;
然后,这允许 GC 在选择时恢复内存,除非您使用的是 AIR,这意味着您可以自己请求 gc 调用:
System.gc();
如果您在 Flash Builder 中进行开发,最佳做法是定期分析您的应用程序并点击按钮强制执行 gc 调用。然后,您可以查看哪些对象在内存中持久存在并找到导致内存泄漏的引用。