【问题标题】:Cocos2d texture memory usageCocos2d 纹理内存使用情况
【发布时间】:2012-02-01 03:14:13
【问题描述】:

我正在使用 cocos2d 并且有一个 1024x1024 的 spritesheet。

我以 RGBA4444 格式加载纹理,它消耗 2MB 标记为“gfxAllocateTextureLevel”。

然后,当我从 spritesheet 创建 CCSprites 时,它会立即消耗额外的 4MB 内存,标记为 glsmLoadTextureLevelBuffer。

总共有 6MB,相对于我的应用而言,这相当多。这是预期的吗?是否需要为每个 spritesheet 甚至 CCSpriteBatchNode 创建这样的缓冲区?谢谢。

【问题讨论】:

  • 你是如何创建 CCSprites 的?你在使用 initWithSpriteSheet 吗?
  • 我用 [CCSprite spriteWithSpriteFrameName@"spr.png"] 创建了一个精灵 我加载了精灵表本身: [[CCTextureCache sharedTextureCache] addImageAsync:@"x.png" target:self 选择器:@selector (gameSpritesLoaded:)];然后在创建批处理节点之前将它们添加到缓存中: [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"x.plist"];

标签: iphone xcode cocos2d-iphone opengl-es-2.0


【解决方案1】:

OpelGLES1.1 Spec 状态:

“GL 以自己选择的内部组件分辨率存储生成的纹理”

=>GPU/驱动程序可能会根据 GPU 的需要将您的像素大小转换为 GPU(GPU 可能仅在某些像素格式上本地运行,因此任何不是这种格式的都将被合成为一种格式),所以我认为您有 2MB 的 RGBA4444 和 4MB 的 RGBA8888 相同的精灵表。

【讨论】:

  • 谢谢,但我不确定我是否遵循。让它以两种像素格式加载它可能做错了什么?
  • gfxAllocateTextureLevel 是 RGBA4444。但是,在GPU使用之前,必须为GPU的使用做准备,这涉及到RGBA8888(GPU原生格式)的转换。
  • 那么使用 RGBA4444 格式有什么意义呢?
  • 任何特定位图格式的意义何在 - 可能存储所需位数最少的图像。 OpenGL ES 不会让您知道内部 GPU 格式是什么。但是,您可以作弊,因为 AFAICT,实现的每个实例(所有 iPhone + IOS5)都具有相同的 GPU 格式,因此您可以根据需要使其匹配。每个 GPU 都有不同的格式,它的优势或劣势。
【解决方案2】:

我也有同样的问题! 我以 RGBA8888 格式加载纹理,它消耗 4MB 标记为“gfxAllocateTextureLevel”。

然后,当我从 spritesheet 创建 CCSprites 时,它会立即消耗额外的 4MB 内存,标记为 glsmLoadTextureLevelBuffer。

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 2013-10-12
    • 2013-03-12
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多