【问题标题】:iOS memory usage variable?iOS内存使用变量?
【发布时间】:2012-02-11 18:36:17
【问题描述】:

我正在用 cocos2d-iphone 开发一个 iPhone 游戏。

我对 CCSpriteFrameCache 目前“持有”多少内存特别感兴趣。我想知道 - 有没有办法知道这一点?不使用任何 Xcode 工具?

也许有一个变量已经让我知道我的应用程序的估计内存消耗值?

【问题讨论】:

    标签: objective-c ios cocos2d-iphone


    【解决方案1】:

    一般来说,你提出的问题并不容易解决。

    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 位;您还必须考虑到 open gl 纹理的大小只有 2 的幂:256x256、512x512、1024x512 等。

    【讨论】:

    • 关于你提到的迭代方法:我对每个纹理进行迭代,将宽度乘以高度,然后求和到计数器?
    【解决方案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));
    }
    

    您想计算每个纹理的位格式,因为可以在缓存中存储不同的纹理格式,具体取决于您当前的需要。它将为您(最后一行)提供内容摘要,包括消耗的总内存。

    【讨论】:

    • 这个结果和segio的回答一样吗?
    • 我认为 Sergio 的回答是间接解决这个问题的方法,而且他没有明确说明每个纹理可能具有每个像素的特定“权重”这一事实。此法出自马口。最后,转到 spriteFrameCache 可能会导致解释困难,因为例如在动画的情况下,许多 spriteFrames(在缓存中)将指向相同的纹理。 coco 中的所有纹理仅在 textureCache 中出现一次(据我所知)。
    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2013-10-08
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多