【问题标题】:Cocos2d-x CCSprite Memory Usage ( releasing CCSprite)Cocos2d-x CCSprite Memory Usage (释放CCSprite)
【发布时间】:2014-04-26 16:18:11
【问题描述】:

我正在 cocos2dx v2.2.3 中开发游戏。我做了一个测试,发现问题如下:

问题:(在 Windows 中)当我运行游戏并检查 TaskManager 时,我发现我的游戏占用了大约 20MB 内存(平均)。

但是在我的游戏LayerInit() 中添加这几行代码之后,它会将内存使用量增加到300MB。

CCSprite *t;
t = CCSprite::create("Character/foo1.png");  //Each picture is about 50MB
t->release();
t = CCSprite::create("Character/foo2.png");
t->release();
t = CCSprite::create("Character/foo3.png");
t->release();
t = CCSprite::create("Character/foo4.png");
t->release();

(我自己为这个测试创建了这些巨大的图片)

t->release(); 调用时,我还检查了 m_uReference。并且m_uReference 变成了0,所以它应该被删除!但是为什么内存使用率那么高呢?

问题:我想知道一段时间后我应该如何删除/移除/释放 CCSprite?


其他信息/测试:

我发现了一些可能有帮助的东西。致电t->release(); 后到达某处:

CCSprite::~CCSprite(void) {
    CC_SAFE_RELEASE(m_pobTexture);
}

但是在CC_SAFE_RELEASE(m_pobTexture);m_uReference 的纹理从 2 减少到 1,因此纹理不会被删除。 我做了一个测试并做出了这个改变:

CCSprite::~CCSprite(void) {
    CC_SAFE_RELEASE(m_pobTexture);
    CC_SAFE_RELEASE(m_pobTexture);
}

RAM 恢复到 ~20MB。 (我也知道这不是正确的方法,我还遗漏了其他东西)

【问题讨论】:

  • cocos2d-iphone 有一个纹理缓存,我想 cocos2d-x 也有一个。尝试清除它。
  • @LearnCocos2D 我同意你关于缓存的可能性,但无法清除或删除它。对不起,你知道怎么做吗?
  • @LearnCocos2D 你能回答我的第二个问题吗? (关于更改现有 ccsprite 图像的最佳方法)
  • 改变它的纹理,它必须有一个属性。至于缓存,请检查 API 参考或在 API 参考中搜索“缓存”或“纹理缓存”的代码。

标签: c++ memory cocos2d-x


【解决方案1】:

首先,您的代码可能会在某处崩溃(除非您遗漏了一些代码):CCSprite::create 返回一个自动发布的CCSprite,这意味着您不需要.release() 它(如果您不要.retain()它,它很快就会被删除)。

对于您的问题:CCSprite 需要 CCTexture 才能工作(您的图像已加载到内存中)。但是CCSprite 不拥有CCTextureCCTextureCCTextureCache 管理。

CCTextureCache 不要在没有CCSprite 使用时直接释放CCTexture:相反,它会保留CCTexture 以供将来使用(因为加载CCTexture 很昂贵)并且只释放@987654336 @当没有足够的内存或者你强迫它这样做时,使用

CCTextureCache::sharedTextureCache()->removeUnusedTextures();

简短的回答是:除非您遇到真正的内存问题(游戏因内存不足而崩溃),否则您不必担心内存的使用。游戏应该会占用大量内存。

【讨论】:

  • 请补充一点,内存中图像的大小也取决于“分辨率”...如果你有一个 2560x1536 大小的图像,它的内存快照会比 1280x720 大图片。正如答案中提到的,当使用 CREATE 创建 Sprites 时,您不必担心自己释放它们,只需确保您添加这些 sprites 的对象,释放它们,以便它们(sprites)可以自动释放。这样会更好检查谁持有这些精灵,从而防止它们被释放。此外,更好的方法是使用 Sprite 表(加载一次并稍后引用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多