2012-01-10 51 views
0

我認爲這是一個內存問題,但我不確定在這裏做什麼。iPad在iPhone 3G和iPhone4不兼容時崩潰

我的問題:

我已經快完成了使用cocos2d中的iPhone遊戲,與視網膜GFX,我所做的應用普及,並已做了調整,使其在iPad上正確運行,大多我使用ipad上的視網膜spritesheets,以及一些額外的圖像(包含在-hd spritesheets中)來覆蓋屏幕邊緣等。

一切工作正常,iPad在遊戲中以60fps運行時,就像在iphone4上(我通常會在iPhone3g上獲得約40-50fps),然而,偶爾在iPad的菜單之間移動5分鐘左右之後(通常,但並非總是在卸載遊戲引擎並移回到米enus),遊戲就結束了。

在調試器中,當一個新的spritesheet或圖形加載後(不是立即),我收到了'接收到內存警告'(不是創建一個精靈,而是實際將新紋理加載到內存中) ,應用程序關閉,我在控制檯中獲得的所有內容都是'(gdb)',沒有堆棧跟蹤。我正在努力尋找解決方案,當從我的遊戲引擎移動到我的菜單時,我有一個加載屏幕,它主要是使用1個全屏圖像創建的,一些文本,所有其他紋理,spriteframe和預加載然後聲音在任何新的東西加載之前從內存中清除。

我試圖在儀器上運行帶有泄漏和分配的ipad,但一旦應用程序加載,儀器每次崩潰。

有沒有人碰巧知道ipad應用程序在關閉前的最大內存空間是多少(我以爲我會得到3個警告,而不是1),以及多少個2048 x 2048表單也可以等同?

編輯:(!發現不合理的記憶消失的事業新)

所以,幾周後,我碰上這個職位上的cocos2d的論壇。

http://www.cocos2d-iphone.org/forum/topic/31092

在iOS5中此錯誤很可能是我的煩惱的主要原因,所有的意見和建議,幫助,在我看來,我的應用程序收緊的全過程。

+0

您是否爲可執行文件啓用NSZombieEnabled? http://www.cocoadev.com/index.pl?NSZombieEnabled – 2012-01-10 09:18:16

+0

崩潰日誌不告訴你什麼? – 2012-01-10 09:24:22

+0

沒有你可以依賴的固定內存量,如果你使用的內存超過了操作系統可以釋放的空間,那麼操作系統會殺死你的應用程序。如果我沒有記錯的話,ipad有iphone4的一半內存,而且你使用的是相同的大圖像。可能是因爲你漏了一些東西。你可以加載很多2048x2048表,沒有大問題 – Ultrakorne 2012-01-10 09:24:32

回答

2

消耗更少的內存。使用CCTextureCache。請記住,Cocos2D總是保存寬度/高度爲2的圖像。因此,如果圖像是513像素,它將使用1024像素的圖像。

CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"randomImage.png"]; 
CCSprite *randomImage = [CCSprite spriteWithTexture:texture]; 

爲了節省更多的內存,您可以使用紋理圖集查看。無論何時切換到菜單或遊戲,都可以調用removeUnusedTextures(或者在調用外存時)。

[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 

您還可以使用較低質量的圖像來節省內存。

[CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444]; 

無論何時您需要加載更高質量的圖像或漸變,您都可以放回原處。

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 
+0

在發佈我的答案之前我沒有刷新頁面,但是我會給你賞金,因爲這個答案無疑會讓我找到解決方案。 – Bongeh 2012-04-11 14:58:27

+0

我不能再授予它21個小時,我明天就會這麼做。 – Bongeh 2012-04-11 14:59:31

+0

http://www.cocos2d-iphone.org/forum/topic/31092 - 這也可能是導致問題的一個重要原因。 – Bongeh 2012-05-30 14:53:14

1

在猜測,它聽起來好像內存警告是在某個地方導致雙重釋放。

這裏要做的第一件事是啓用殭屍對象。以前,你在Target的參數中設置了NSZombieEnabled。最近,Xcode增加了對殭屍的UI支持。這下就可以發現:

管理計劃...>編輯...>診斷>啓用殭屍對象

這將導致當它檢測到AA釋放的對象被訪問的調試器斷點,並應該給你一個堆棧跟蹤,以幫助診斷。

在模擬器中測試時,可能會手動生成內存警告。

iPhone模擬器>硬件>模擬內存警告

另一種方法是一個動作添加到您的UI簡單地分配更多的內存,它可以使用,直到崩潰被觸發:這下就可以找到。到malloc一個簡單的調用就足夠了:

- (IBAction)simulateMemoryLeak 
{ 
    malloc(1024 * 1024 * 10); // Leak 10MB of memory. 
} 

儀器崩潰難以診斷的,但我發現Xcode中的一個乾淨的重新安裝有固定儀器崩潰,我的問題了過去。

注意儀器使用發佈配置來運行,而正常調試使用調試配置,所以做檢查,你可以在發佈配置下恢復正常運行。嘗試與儀器運行之前。

爲iPad使用視網膜圖形將佔用大量內存,因此請確保您正確卸載UIImageView網點。

特別是要確保你理解了View Controller LifecycleviewDidUnload(稱爲低內存條件)卸載視圖網點,而不僅僅是dealloc

View Controller Lifecycle

爲了幫助進一步診斷,請儘量包括任何你可以你如何建立你的菜單UI提供更多的信息(你的狀態,這很可能是飛機失事的原因),以及如何你」重做內存管理(使用ARC,使用autorelease池等)

0

你有一個viewDidUnload方法,它釋放你仍然需要的東西嗎?當你收到記憶警告時,這將被調用,所以你必須小心你的空閒。只需使用它來釋放可以在需要時重新加載的東西。

相關問題