2012-02-25 94 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時需要考慮到這一點。