我正在使用cocos2d-iphone开发iPhone游戏。
我特别感兴趣的是CCSpriteFrameCache目前有多少内存“持有”。我在想 - 有没有办法知道这一点?不使用任何Xcode工具?
也许有一个变量可以让我知道我的应用程序估计的内存消耗值?
答案 0 :(得分: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位;你也必须考虑到开放的gl纹理只有2的功率:256x256,512x512,1024x512等。
答案 1 :(得分: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));
}
您希望按位格式计算每个纹理,因为可以根据您当前的需要在缓存中存储不同的纹理格式。它将为您(最后一行)提供内容摘要,包括消耗的总内存。