2012-02-11 76 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