2013-01-21 68 views
3

我們正在爲iPhone製作遊戲。我們已經完成了開發並試圖優化現在的遊戲內存。我們注意到,當我們在遊戲中加載特定的MVC時,並非所有分配的內存都被釋放(大約增加了4-5MB)。如果您持續播放該遊戲15-20分鐘,這會使遊戲的內存使用量非常高,並且在發出低內存警告後遊戲最終崩潰。減少iPhone應用程序的內存使用量

這是我綁
1.運行靜態分析儀上的遊戲和固定所有的內存泄漏和警告。
2.手動檢查所有類的dealloc是否被調用。這似乎很好。
3.也嘗試在Xcode中運行Allocations工具,但其中的大部分條目都是CFStrings,mallocs和CFNumbers等,但並不真正告訴我的哪些類來自它們。有更好的方法來使用分配工具嗎?

我也有一對夫婦的內存相關的問題
1.我們使用在遊戲中很多地方自動釋放對象,而無需使用一個自動釋放池。我的理解是自動釋放的對象應該在下一次運行循環中釋放,並且不應該造成如此大的問題?
2.另外,如果我通過xib文件加載圖像,它們會被iOS緩存。他們是否也會佔用內存?

我該如何解決我的內存使用問題。任何幫助,將不勝感激。 謝謝!

+1

我敢肯定,autoreleased對象需要一個池來釋放該線程...... – DavidAndroidDev

+0

@DavidAndroidDev真的,但應用程序的主要autorelease池通常就足夠了。如果需要,您可以擁有自己的autorelease池,但通常不需要。 – Rob

+0

@Rob不是隻對主線程是真的嗎?如果你在後臺線程中創建對象,我相信它需要自己的池。我不確定OP的應用程序是否正在運行任何輔助線程,但我記得需要一個輔助線程的自動釋放池。我會看看我能否找到我發現的地方。 – DavidAndroidDev

回答

2

如果您正在「製作過程中」,則應該使用ARC (automatic reference counting)。一旦你全部轉換爲ARC,你將不再需要這些autorelease對象,編譯器會在適當的時候釋放對象。如果您發現某些對象池仍然失去控制,您可以使用@autoreleasepool聲明來創建自己的自動釋放池。

我認爲切換到ARC將幫助你,並使你的進一步發展更簡單。轉換爲ARC後,再次在儀器中對您的應用程序進行配置文件並縮小任何創建大型對象池的代碼。

如果您選擇不轉換爲ARC,根據您的解釋,聽起來您可以對您所指的視圖有一個保留週期。確保視圖實際上是通過追蹤它保留的每個位置而被釋放的。

+0

因爲我們幾乎完成了開發工作,所以現在切換到ARC將會非常困難和耗時。我已經檢查過所有視圖控制器和涉及的其他類的調用的零售週期和dealloc。 – tbag

4

一對夫婦的想法:

  1. 是否使用Core Foundation的課?確保針對您調用CFRelease(或轉移所有權,然後releaserelease或 Objective-C對象)名稱中的CreateCopy的核心基金會呼叫的每個對象。

  2. 您是否也在樂器中使用過Leaks工具?我假設如此,但你沒有提到它。請參見儀器用戶指南中的Finding Leaks in your App

  3. 您是否正在通過imageNamed加載圖片?緩存圖像,並不好釋放它們。使用imageWithContentsOfFile並手動管理您的緩存更安全。

  4. 我假設你的視圖控制器的dealloc被調用,並且你釋放所有與類屬性/ ivars相關的對象?

  5. 你有殭屍打開嗎?這對於診斷目的非常有用,但是直到關閉殭屍時纔會釋放內存。

2

什麼羅布和克里斯說,那麼這樣做:

使用分配儀器配置爲只跟蹤活動的撥款,並記錄引用計數。

當Allocations收集數據,然後暫停您的應用程序時,使用您的應用程序。

暫停時,按實時字節和#生活排序是您最有用的視圖。對於利用Foundation集合類的以數據爲中心的應用程序,* String,* Dictionary和* Array的組合可能是最常見的。

這沒關係。如果您點擊其中任何一個的詳細信息,您將獲得當前在內存中的所有實例的長列表。你可以po <addr>其中任何一個來看看他們是什麼。您還可以滾動瀏覽列表,查看哪些功能是最常見的分配負責。同樣,您可以點擊任何實例來查看它的分配位置和/或爲什麼它可能仍然存在。

同樣,您可以從概覽表開始,按#Living排序,然後向下滾動到其中一個類的第一個實例。如果這個班級紮根 - 掌握了大量數據,那麼消除或優化這是一個很好的開始。

而且,當然,不要忘記heapshot analysis是一個非常有效的記憶增長分析分析工具。