2012-02-11 36 views
2

我正在開發與cocos2d-iphone的iPhone遊戲。iOS內存使用變量?

我特別感興趣的是CCSpriteFrameCache目前有多少內存「持有」。我想知道 - 有什麼方法可以知道嗎?不使用任何Xcode工具?

也許有一個變量,已經讓我知道我的應用程序估計內存消耗值?

回答

2

實際上,如果你關心紋理的內存消耗,它們會被CCTextureCache存儲。在那裏有一個叫做dumpCachedTextureInfo方法的CCTextureCache(Debug)方法。我還沒有嘗試過自己,但這裏:

@implementation CCTextureCache (Debug) 

-(void) dumpCachedTextureInfo 
{ 
NSUInteger count = 0; 
NSUInteger totalBytes = 0; 
for (NSString* texKey in textures_) { 
    CCTexture2D* tex = [textures_ objectForKey:texKey]; 
    NSUInteger bpp = [tex bitsPerPixelForFormat]; 
    // Each texture takes up width * height * bytesPerPixel bytes. 
    NSUInteger bytes = tex.pixelsWide * tex.pixelsHigh * bpp/8; 
    totalBytes += bytes; 
    count++; 
    CCLOG(@"cocos2d: \"%@\" rc=%lu id=%lu %lu x %lu @ %ld bpp => %lu KB", 
      texKey, 
      (long)[tex retainCount], 
      (long)tex.name, 
      (long)tex.pixelsWide, 
      (long)tex.pixelsHigh, 
      (long)bpp, 
      (long)bytes/1024); 
} 
CCLOG(@"cocos2d: CCTextureCache dumpDebugInfo: %ld textures, for %lu KB (%.2f MB)", (long)count, (long)totalBytes/1024, totalBytes/(1024.0f*1024.0f)); 
} 

需要每個紋理計算位格式,因爲它可以存儲在緩存中不同的紋理格式,根據您當前的需要。它會給你(最後一行)內容摘要,包括消耗的內存總量。

+0

這個結果和segio的答案一樣嗎? – Voldemort 2012-02-11 21:20:30

+0

我認爲塞爾吉奧的答案是達到這個目標的間接方式,而且他並沒有明確表示每個紋理可能都有其每個像素的特定「重量」。這種方法是直接從馬的嘴裏。最後,轉到spriteFrameCache可能會導致解釋困難,因爲例如在動畫的情況下,許多spriteFrame(在緩存中)將指向相同的紋理。可可所有的紋理最終只在textureCache中存在一次(盡我所知)。 – YvesLeBorg 2012-02-11 21:45:07

3

一般來說,你所提出的問題並不容易解決。

CCSpriteFrameCache的情況下,由於該類包含指向紋理幀的NSMutableDictionary的指針,因此您可以迭代字典並累積紋理尺寸(乘以每個像素的尺寸)。

另一種方法是字典中能轉化爲NSData的是這樣的:

NSData * data = [NSPropertyListSerialization dataFromPropertyList:spriteFrameDictionary 
    format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];  
NSLog(@"size: %d", [data length]); 

但是這需要你以實現對CCSpriteFrame類NSCoding協議。

關於累積紋理大小,可以按寬度乘以像素大小;像素大小取決於像素格式:RGBA8888是32位,RGB565是16位;你也必須考慮到,開放式紋理貼圖的尺寸只有2:256x256,512x512,1024x512等。

+0

關於您提到的迭代方法:我遍歷每個紋理,將寬度乘以高度,並將其與求和值相加? – Voldemort 2012-02-11 19:46:59

+0

@Omega,看我的編輯... – sergio 2012-02-11 19:54:49