2012-11-21 34 views
3

我正在開發一款適用於iPad的遊戲。當我在ipad上運行遊戲時,ipad會自動關閉缺少內存的應用程序。 使用TexturePacker將圖像轉換爲pvr,但是從場景到場景都無法釋放內存。在cocos2d中開發遊戲的內存問題

[CCTextureCache sharedTextureCache] removeUnusedTextures]; 

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 

我正在使用這些行,但還不夠。

有什麼想法?

回答

2

請考慮:

  1. 使用儀器泄漏工具 - 試圖在同一特定時刻做出的快照(例如,當您準備運行場景),然後檢查什麼是他們之間進行分配。
  2. 嘗試在程序的特定部分打印應用程序使用的內存,找出內存泄漏的位置。
  3. 試着找出當你刪除你的場景時,不會調用哪個dealloc,然後再深入。
  4. 嘗試調用通用功能,而不是未使用的:

    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; [[CCTextureCache sharedTextureCache] removeAllTextures];

+0

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; [[CCTextureCache sharedTextureCache] removeAllTextures]; 我正在使用這些行。我應該犯一個錯誤,但我沒有注意到。 還有什麼想法? – PedroMeira

+1

您也可以嘗試將類別添加到'CCTexture2D'並覆蓋'init ...'&'dealloc'來更新靜態'NSMutableArray',然後在設置場景之前將其打印出來。這樣你可以看到是否有紋理仍然沒有被釋放。重要提示:將它們添加到'NSMutableArray'作爲非保留。 –

+0

@TomaszZabłocki:我爲人不知道如何將對象添加到NSMutableArray而不增加其保留數。事實上,這是防止紋理從緩存中移除的一種方法。 – YvesLeBorg

1

在刪除未使用的材質,用途:

[CCAnimationCache purgeSharedAnimationCache]; 
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
[[CCDirector sharedDirector] purgeCachedData]; 

CCLOG(@"%@<applicationDidReceiveMemoryWarning> : after purge", self.class); 
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]; 

這將列出仍在紋理保留在緩存中,以及它們消耗的內存量。當你期望它被丟棄時,任何仍然存在的紋理可能都存在,因爲某處沿着(代碼;)行的方向,你保留了它們「以某種方式」(例如,將它們添加到數組中)。