我正在努力减少AS3应用程序的内存需求。我了解,一旦没有剩余的对象引用,该对象将被标记为垃圾回收的候选对象。
尝试删除不再活跃使用的Loader的引用甚至值得吗?我首先想到的是不值得。
原因如下:
我的Sprite需要永久引用它们显示的位图(因为Sprite在我的应用中始终可见)。因此,无法对位图进行垃圾收集。位图依赖于BitmapData对象获取其数据,因此我们无法摆脱它们。 (到目前为止,一切都很简单)。
这是我不确定发生了什么的地方:
BitmapData是否引用加载程序加载的数据?换句话说,是BitmapData本质上只是一个引用loader.content的包装器,还是将数据从loader.content复制到BitmapData?
如果维护了引用,那么通过垃圾回收装载程序我什么也得不到。
有什么想法吗?
最佳答案
与第三方产品一起使用AMF有点使我相信Loader类尝试实例化给定内容类型的新类(在这种情况下,它将是Bitmap类实例)。您可能正在从Bitmap实例构造一个新的BitmapData对象。据此,我假设Loader实例引用了Bitmap实例,在您的情况下,您的代码也引用了Bitmap实例。除非您正在调用BitmapData.clone()。
还有两种强制GC的方法。 Force Garbage Collection in AS3?
您可能会发现将一些任意大的对象附着到某个对象上,然后强制GC查看该对象是否正在清理或漂浮起来很有用。如果您使用的是Windows,则procmon(http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)之类的东西比任务管理器对执行此类外部检查更为有用。
当然,这是一个反复的尝试,但是由于缺少像Visual VM(https://visualvm.dev.java.net/)这样的东西,我们有点陷入了Flash世界。
关于apache-flex - AS3内存保护(加载程序/BitmapDatas/Bitmaps/Sprites),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1677835/