C++ Cocos2d-x CCSprite内存使用情况(释放CCSprite)

C++ Cocos2d-x CCSprite内存使用情况(释放CCSprite),c++,memory,cocos2d-x,C++,Memory,Cocos2d X,我正在cocos2dx2.2.3中开发一个游戏。我做了一个测试,发现一些问题如下: 问题:(在windows中)当我运行游戏并检查TaskManager时,发现游戏占用了约20MB内存(平均) 但是在我的游戏层的Init()中添加这些代码行之后,它会将内存使用量增加到300MB CCSprite *t; t = CCSprite::create("Character/foo1.png"); //Each picture is about 50MB t->release(); t = CC

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

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

但是在我的游戏
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();
(我自己为这次测试制作了这些图片)

t->release()时,我还检查了m\u引用正在呼叫。而且
m\u参考
正在变成
0
,因此应该删除它!但为什么内存使用率这么高

问题:我想知道在一段时间后我应该如何删除/删除/发布CCSprite


附加信息/测试:

我找到了一些可能有用的东西。调用
t->release()后它可以到达:

CCSprite::~CCSprite(void) {
    CC_SAFE_RELEASE(m_pobTexture);
}
但在
CC_安全发布(m_pobTexture)
m\u参考
纹理从2减少到1,因此纹理不会被删除。 我做了一个测试并做了以下更改:

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

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

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

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

CCTextureCache
当不再使用
CCSprite
时,不要直接释放
CCTexture
:相反,它会保留
CCTexture
,以备将来使用(因为加载
CCTexture
非常昂贵),并且只有在内存不足或您强制它这样做时,才释放
CCTexture
,使用

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

简单的回答是:你不应该担心内存的使用,除非你有一个真正的内存问题(因为内存不足导致游戏崩溃)。游戏应该使用大量内存。

cocos2d iphone有一个纹理缓存,我想cocos2d-x也有一个。尝试清除它。@learncos2d我同意您关于缓存可能性的看法,但无法清除或删除它。对不起,您知道怎么做吗?@learncos2d您可以回答我的第二个问题吗?(关于更改现有ccsprite图像的最佳方法)更改其纹理,它必须有一个属性。至于缓存,请检查API参考或搜索代码以查找“缓存”或“texturecache”(如果不在API参考中)。请补充,内存中图像的大小也取决于“分辨率”。。。假设您有一个2560x1536大小的映像,它的内存快照将比1280x720映像大。正如在回答中提到的,当使用CREATE创建精灵时,您不必担心自己会释放它们,只要确保您将这些精灵添加到的对象,释放它们,这样它们(精灵)就可以自动释放。最好检查谁持有这些精灵,从而防止它们被释放。另外,更好的方法是使用精灵图纸(一次加载,稍后再引用)