2012-07-12 51 views
0

我在cocos2d項目中遇到內存管理問題。對於我的應用程序,我需要在交互開始之前構建所有動畫。我有三個動畫。 每個人都有像PNG文件,分辨率爲1300×1000像素,大小爲200ko。內存崩潰,動畫預加載cocos2d

所以在我的初始化我只是寫:

self.animation = [CCAnimation animation]; 
[_animation setDelayPerUnit:0.04]; 
for(int i = 1; i <= 20; i++) 
{ 
    [_animation addSpriteFrameWithFilename:[NSString stringWithFormat:@"image(%d)@2x.png",i]]; 
} 
[[CCAnimationCache sharedAnimationCache] addAnimation:_animation name:@"animationWin"]; 

這種代碼被執行三次。如果我運行我的應用程序,它直接崩潰。如果我只是預加載2個動畫,我沒有崩潰。 如果我在for循環中設置斷點,我可以看到它在它內部崩潰。

我不知道如何解決這個問題...你有一個想法嗎?

非常感謝您的幫助!

回答

2

每個人都有像分辨率爲1300 x 1000像素的20 png文件和 大小爲200ko。

讓我們來做一些數學,我們可以嗎?

在假設的PNG文件是32位的,你沒有NPOT(非電力的二)支持啓用,每一個紋理消耗:

1300x1000 =>擴大到兩個功率= > 2048x1024 =>像素數量=> 2,097,152 =>時間32位(4字節)每像素顏色深度=> 8兆字節=>次數20紋理=> tadaaa ...高達160 MB的紋理內存使用率。

嗯,這是你的問題!

PNG的文件大小並不重要。這是一種壓縮格式。但紋理是未壓縮的,除非你切換到真正壓縮好的PVR,但你也會得到僞影和變色。

絕對最好的解決方案是調整您嘗試加載的藝術品的尺寸和/或數量。

+0

感謝您的解釋。我減少了我的PNG上的空白空間,現在很好 – Pierre 2012-07-13 06:57:54

0

嗯,我認爲你正在使用太多的內存。你應該嘗試使用spritesheets/batchnodes,另一種紋理格式如PVRTC,並嘗試不同的像素格式。

與所有上述的幫助下,我建議Texture Packer

+0

f ***。有沒有辦法刪除我不再使用的所有以前的精靈? – Pierre 2012-07-12 13:59:34

+0

CCSprites或紋理(png)?如果是第二個,你可以嘗試在紋理緩存 – Setrio 2012-07-12 14:01:45

+0

我試圖彈出我的老場景,然後重新分配我的導演和刪除所有緩存的紋理,然後把我的新場景removeUnusedTextures ......同樣 – Pierre 2012-07-12 14:45:26

2

下面將清除的東西給你。

NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : before purging all caches"); 
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]; 
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
[[CCDirector sharedDirector] purgeCachedData]; 
NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : after purging all caches"); 
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]; 

更改爲PVR格式不會幫助,因爲它是紋理大小決定的內存量(PVR只將在「磁盤」的大小和加載時間中受益,不是RAM運行時需要)。每個像素的深度將爲:

+(void) mediumPixelFormat{ 
    [CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444]; 
} 

您可以隨時更改格式。另外我注意到1300x1000,這在POT中非常浪費。這實際上會佔用2048x2048紋理的空間。任何方式你可以與你的圖形藝術家合作將其刮至1024x1024,或將3個紋理合併爲2?