我正在開發與cocos2d-iphone的iPhone遊戲。iOS內存使用變量?
我特別感興趣的是CCSpriteFrameCache目前有多少內存「持有」。我想知道 - 有什麼方法可以知道嗎?不使用任何Xcode工具?
也許有一個變量,已經讓我知道我的應用程序估計內存消耗值?
我正在開發與cocos2d-iphone的iPhone遊戲。iOS內存使用變量?
我特別感興趣的是CCSpriteFrameCache目前有多少內存「持有」。我想知道 - 有什麼方法可以知道嗎?不使用任何Xcode工具?
也許有一個變量,已經讓我知道我的應用程序估計內存消耗值?
實際上,如果你關心紋理的內存消耗,它們會被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));
}
需要每個紋理計算位格式,因爲它可以存儲在緩存中不同的紋理格式,根據您當前的需要。它會給你(最後一行)內容摘要,包括消耗的內存總量。
一般來說,你所提出的問題並不容易解決。
在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等。
這個結果和segio的答案一樣嗎? – Voldemort 2012-02-11 21:20:30
我認爲塞爾吉奧的答案是達到這個目標的間接方式,而且他並沒有明確表示每個紋理可能都有其每個像素的特定「重量」。這種方法是直接從馬的嘴裏。最後,轉到spriteFrameCache可能會導致解釋困難,因爲例如在動畫的情況下,許多spriteFrame(在緩存中)將指向相同的紋理。可可所有的紋理最終只在textureCache中存在一次(盡我所知)。 – YvesLeBorg 2012-02-11 21:45:07