2014-10-08 77 views
0

美好的一天,AIR Android運行時內存泄漏

我正在開發一款適用於Android的AIR冒險遊戲。我正在實例化庫(電影剪輯)中的各個級別,每個級別至少包含一個高清分辨率位圖。

遊戲開始時,它佔用大約150MB的內存,包括AIR運行時和SWF。在這150MB的SWF目前大約是12MB。

隨着遊戲進展,AIR運行時的內存消耗增加,而SWF使用的內存保持在15-20MB左右。當總內存消耗量達到350(!)MB左右時,操作系統干預並終止應用程序。

我非常小心,只要有可能就重用對象,並取消任何未使用的對象以使其符合GC條件。 GC似乎正在工作,因爲SWF使用的內存在15-20MB左右保持穩定。我可以看到它從20從時間下降到12時在GC踢

事情我已經試過:

  • 刪除了所有的cacheAsBitmap和性能的cacheAsBitmapMatrix。
  • 將每個級別導出到單獨的SWF中,並從那裏加載它們而不是庫。
  • 強制執行GC hack只是爲了查看它是否有任何效果。
  • 用System.pauseForGCIfCollectionImminent(n)擺弄不同的n值。
  • 試過不同的加速模式(直接和自動),也許GPU的思維錯誤。

所有失敗的內存消耗都會消失。

這隻發生在Android上。在個人電腦上一切都很好,整個事情需要大約250-300MB,並且這個數字保持穩定,不管我一個接一個地加載多少個級別。沒有機會在iOS上測試。

我真的很感激任何想法或見解,如何使這個問題消失。

謝謝。

+1

您將變量設置爲null並不意味着它將立即被GC收集。如果您使用大型位圖,則應該使用bitmapdata類的dispose()方法立即釋放內存。 – Fygo 2014-10-08 15:49:06

+0

謝謝,我會嘗試dispose()方法。問題在於這些位圖手動放置在Flash IDE的時間線上。每個級別都是一個複雜的MovieClip,其中包含時間軸上的位圖和其他MC。在運行時,這些位圖被內部轉換爲形狀,並且它們的BitmapData變得不可訪問。我會考慮通過腳本將這些位圖放置在顯示列表上,以便在不需要時可以銷燬它們。感謝您的輸入。 – Nedudgi 2014-10-09 12:27:13

回答

0

1)查找內存泄漏的最簡單方法是使用Adobe Flash Builder。只需運行分析。

2)也是排除未來泄漏的好方法:創建將用於「清洗」的功能。例如。它會清空實例的所有局部變量等等。像通常的C++析構函數一樣。然後,在清空你的對象之前,只需調用這個方法即可。

+0

我只使用Flash IDE直到現在,我不熟悉Flash Builder。不過,我會研究它。謝謝。 – Nedudgi 2014-10-09 12:30:00

+0

請注意,它將colud作爲分析器連接到任何使用調試模式編譯的swf :) – Selirion 2014-10-10 02:59:32