2012-02-25 114 views
3

对于游戏(使用AIR for iOS),我想阻止GC在特定的30秒内运行(因为它会导致非常显着的滞后)。adobe AIR:阻止GC运行

我已经做的就是在序列开始之前调用System.gc()。在序列中,我不会创建许多新对象,只有一些动画播放和对象移动(以3D形式)。一些物体移出舞台。

在此序列中的存储器统计aproximately:

System.totalMemory: 4.5 MB 
System.freeMemory: 1.0 MB 
System.privateMemory: 75 MB 

当GC火灾,该System.privateMemory下降到74 MB,但会导致aproximately一秒的延迟。 GC在这30秒的时间内发射两次。

所以我的问题是关于任何技术,黑客或workarrounds(除了优化内存使用一般 - 显然我已经在这方面工作),以防止GC在这30秒内发射?

感谢。

+0

你有很多的对象? – Cameron 2012-02-25 04:28:16

+0

好 - 有很多 - 几百个我会说 - 但我并没有在这个序列中创建大量新的(我可能添加50个显示对象,并在30秒内再次移除它们) – Mat 2012-02-25 05:40:06

+1

它会帮助创建对象在序列之前,保持它们不可见,并且只是通过可见性进行播放,不会使用对象创建/删除来警告GC ... – catholicon 2012-02-25 08:39:27

回答

1

我不确定您是否可以阻止垃圾收集运行。

垃圾收集运行,因为系统需要更多资源,如果系统资源耗尽,您的应用程序将崩溃。也许你应该想出另一种执行你的任务的方式,而不需要资源。

另请注意,在您的代码中使用System.gc()仅适用于Flash Player的调试版本。

我想我也读的地方,正确使用的System.gc()作为测试的一部分,你应该把它叫做两次:

System.gc(); 
System.gc(); 

的第一次马克未使用的内存,第二次扫描

http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

+0

它并不真的需要内存。我减少了内存占用,并且在完全同时发生滞后。发生这种情况时,System.privateMemory的内存使用量将在短时间内下降(此时System.totalMemory和System.freeMemory似乎不受影响)。它可能是与我的ByteCode无关的垃圾收集,而是垃圾收集的AIR运行时本身? – Mat 2012-02-25 16:43:32

+0

不确定。我想知道是否使用怪物调试器可以揭示发生了什么。 http://www.demonsterdebugger.com/ – crooksy88 2012-02-25 16:59:58

2

你不能阻止GC运行。但我想指出,致电System.gc()有两个问题。

首先,你应该检查它是否启用。 documentation说:

仅适用于Flash Player调试器版本和AIR应用程序。在AIR应用程序中,System.gc()方法仅在AIR Debug Launcher(ADL)中运行的内容中启用,或者在已安装的应用程序中在应用程序安全沙箱中的内容中启用。

二,只需要调用System.gc()一次,实际上可能不会释放内存。请参阅这里了解更多information

+1

我知道调试和安装的应用程序 - 但我认为AIR for iOS已安装应用程序? – Mat 2012-02-25 13:49:42

1

正如其他人所说,不可能阻止GC运行。有两种可能的方法可以帮助摆脱滞后:

  1. 确保您保留在动画过程中创建的所有对象,直到动画完成后。然而,这可能会导致严重的内存问题,全部取决于对象的数量和内存消耗
  2. 在动画期间定期运行System.gc()(两次),这将导致内存清理分布并希望展开滞后
0

您可以通过不创建垃圾来防止这种情况。这意味着没有未引用的对象,对象等等。如果您知道性能并不重要,则可以通过删除所有引用并使其成为null来销毁对象,GC将开始执行它的工作。

GC仍然会“寻找垃圾”,但它应该使用更少的意外资源。

与引用的事情是,在AS3中所有对象都指向了“真实”的对象,除了原始值,如int,UINT,字符串等,这是很容易核实的

var a = new Object(); // we create an Object and a pointer called "a" 
a.property = "I'm alive"; 
var b = a; // we create a pointer to the Object called "b" 
a = null; // the Object still exists 
trace(b.property) // I'm alive 
b = null; // the Object still exists but is unreferenced, and will be GCed 
trace(b.property) // Error 

保持在使用GC时需要考虑到这一点。