2013-03-13 81 views
0

我使用ActionScript3开发网络和手机游戏。记忆是我最大的敌人,我总是不知道一些物体的细节寿命。例如: 位图 我知道有一个位图数据的“处置”功能。所以总是我通过使用“bitmap.bitmapData.dispose”来处理一个位图对象。但是,我不知道位图对象的引用是否为0,即使我不调用dispose函数,GC是否将释放此对象所使用的内存。所有ActionScript3对象的详细使用寿命

我有太多像上面的问题(声音,纹理,BaseTexture ...)。有没有人有关于这个话题的一些想法?

回答

0

对象的寿命是由一件事决定的 - 如果它不再从任何地方引用,它被认为是死的(孤立的)并且是从内存中删除的主题。所以是的,即使没有明确的dispose()调用,如果删除对它的所有引用,BitmapData对象也将从内存中删除。

关于声音或纹理的对象 - 这是最好的被重用,例如,你可以叫mySound.play()多次,这将产生一个独立的SoundChannel对象,它的寿命是关于声音的持续时间,如果是未引用。同样,您可以使用相同的Texture对象来使其具有纹理的多个实例。

对于那些扩展了EventDispatcher的类有一个特殊规则,因为它们可以监听事件,并且如果不会对该对象使用弱引用,则会将事件监听器直接附加到该实例,从而使额外的引用链接,这将有效地禁止GC回收该对象占用的内存。所以你应该总是完全控制所有强参考监听器,至少为了这个目的。

希望这会有所帮助。

+0

非常感谢@Vesper,这非常有帮助。所以对于纹理,即使我没有调用类Texture的dispose函数,GC也可以释放与之相关的所有GPU资源。这是真的吗?顺便说一句,你知道如何测量应用程序使用了多少GPU内存。 totalMemory和privateMemory似乎不适用于GPU内存。 – Tinggo 2013-03-13 06:47:08

+0

http://stackoverflow.com/questions/10479174/how-much-of-gpu-ram-is-used-by-flash-stage3d似乎这个问题就像你的问题,答案就是你需要的。 (但是,如果Scout会变得不自由,那将是一件非常糟糕的事情) – Vesper 2013-03-13 07:03:22