咨询一个sprite内存无法释放的问题。

使用cocos2dx移植一个j2me的老项目。

j2me显示图片的drawimage方法和cocosdx的addchild原理不太一样。需要一直调用。

我在游戏开始的加载图片资源的init函数里使用如下方法。

//-----------------------------------------------------------------------------

img = loadImage(“main_0_r49@2x.jpg”);imageRetain(img);

//-----------------------------------------------------------------------------

cocos2d::Sprite* TTBase::loadImage(const char* imgString)
{

return CCSprite::create(imgString);

}

//-----------------------------------------------------------------------------
void TTBase::imageRetain(cocos2d::CCSprite* img)
{
if(img!=NULL)
{
img->retain();
}

}

//-----------------------------------------------------------------------------

然后使用drawimage显示图片(在主循环里一直刷新这个函数)。

//-----------------------------------------------------------------------------

drawImage(img,move_x,0,leftTop);

//-----------------------------------------------------------------------------

模拟的drawimage函数
void TTBase::drawImage(cocos2d::CCSprite* img,int x, int y,int position)
{

if(img!=NULL)
{

        img->setScaleX(scaleX);
        img->setScaleY(scaleY);

imgX=(img->getContentSize().width/2)(scaleX);
imgY=(img->getContentSize().height/2)
(scaleY);

if(position==leftTop)
{

            img->setPosition(ccp(x*codeScaleX+imgX, -y*codeScaleY-imgY+screenHeight));
        }

//判断是否addChild了
if ((img)->getParent()==NULL)
{
//addChild(CCNode *child, int zOrder)
this->addChild(img,0);

        }

else
{
this->reorderChild(img,1);
}

    }

}

//-----------------------------------------------------------------------------

我的理解是退出游戏时,调用img-release();释放内存。不过发现并不释放内存。问下如何解决这个问题。

查了下addchild时也会retain一遍,不知是不是这个问题。但是图片资源加载时如果不retain的话,后面调用drawImage时会死机。

自己顶一下

其实是一个机制的问题。你可以看下sprite::create()函数,里边自动把提供的图片加载到了缓存里边,而这个缓存采用的单例机制,避免了重复使用一张负片导致的内存暴增问题,不过这就造成了你现在的情况,这也就是因为对cocos2dx本身机制不熟悉造成的一些小错误,要解决的建议就是提前吧图片用addSpriteFramesWithFile加入到缓存中,然后精灵直接使用,当不需要这个缓存图片的时候释放这个缓存,而不是释放图片本身。
我担心我理解你的问题可以有误,所以回答可能也有误,你自己分析下,看是不是这个问题,能否解决也请回复下,免得以后小伙伴遇见类似问题不晓得去哪里找答案。

— Begin quote from ____

引用第2楼fanyang0601于2015-05-22 17:15发表的 :
其实是一个机制的问题。你可以看下sprite::create()函数,里边自动把提供的图片加载到了缓存里边,而这个缓存采用的单例机制,避免了重复使用一张负片导致的内存暴增问题,不过这就造成了你现在的情况,这也就是因为对cocos2dx本身机制不熟悉造成的一些小错误,要解决的建议就是提前吧图片用addSpriteFramesWithFile加入到缓存中,然后精灵直接使用,当不需要这个缓存图片的时候释放这个缓存,而不是释放图片本身。
我担心我理解你的问题可以有误,所以回答可能也有误,你自己分析下,看是不是这个问题,能否解决也请回复下,免得以后小伙伴遇见类似问题不晓得去哪里找答案。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=301854&pid=1313067

— End quote

谢谢。

按照你的思路解决了问题。具体方法如下:

加载图片时:

cocos2d::CCSprite* imgTitleBg;

cocos2d::CCTexture2D* imgTitleBgT2D;

imgTitleBgT2D = loadImageTexture2D(“titlebg@2x.jpg”);imgTitleBg = loadImageSprite(imgTitleBgT2D);imgTitleBg->retain();

cocos2d::CCTexture2D* TTBase::loadImageTexture2D(const char* imgString)
{
return CCTextureCache::sharedTextureCache()->addImage(imgString);

}

cocos2d::CCSprite* TTBase::loadImageSprite(cocos2d::CCTexture2D* imgTexture2D)
{
return CCSprite::createWithTexture(imgTexture2D);

}

释放图片时:

imageRelease(imgTitleBg);

removeTexture2D(imgTitleBgT2D);

void TTBase::imageRelease(cocos2d::CCSprite* img)
{
if(img!=NULL)
{
CC_SAFE_RELEASE(img);
}

}

void TTBase::removeTexture2D(cocos2d::CCTexture2D* imgTexture2D)
{
CCTextureCache::sharedTextureCache()->removeTexture(imgTexture2D);

}