Cocos2d-x CCSprite Memory Usage ( releasing CCSprite)

Cocos2d-x CCSprite Memory Usage ( releasing CCSprite)

本文关键字:CCSprite releasing Usage Memory Cocos2d-x      更新时间:2023-10-16

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

问题:(在窗口中(当我运行游戏并检查任务管理器时,我发现我的游戏占用了~20MB内存(平均(。

但是在我的游戏Layer Init()中添加这些代码行后,然后将内存使用量增加到 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();

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

我还检查了m_uReference t->release();何时打电话。 并且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。(我也知道这不是正确的方法,我错过了其他东西(

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

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

CCTextureCache不再CCSprite使用它时直接发布CCTexture:相反,它会保留CCTexture以供将来使用(因为加载CCTexture很昂贵(,并且仅在没有足够的内存或您强制它这样做时才释放CCTexture,与

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

简短的回答是:除非你有真正的内存问题(由于内存不足而导致游戏崩溃(,否则您不必担心使用的内存。游戏应该使用大量内存。