本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=131
一、介绍
被缓存的纹理之后还能被用来绘制。但是每一个被缓存图片的大小、颜色和纹理框都不能被改变。这个信息被存储在内存中因此不用每次绘制的时候再发送到GPU中。
二、CCTextureCache
Cocos2dx 借助CCTextureCache或者CCSpriteFrameCache来使用纹理缓存来保持CCSprite。你可以提前把纹理加载进缓存中并且在场景中一直可用。如何加载这些纹理需要你自己根据实际情况决定。比如,你可以选择异步加载他们,或者使用有滚动条的加载页面来加载他们。
当你创建了一个精灵,你一般会这么用CCSprite::create(pszFileName),如果你看看这个CCSprite::create(pszFileName)函数的内部实现方法,你将会发现它添加这些图片到了纹理缓存中:
bool CCSprite::initWithFile(const char *pszFilename)
{
CCAssert(pszFilename != NULL, "Invalid filename for sprite");
CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);
if (pTexture)
{
CCRect rect = CCRectZero;
rect.size = pTexture->getContentSize();
return initWithTexture(pTexture, rect);
}
//不要释放,当加载纹理失败,相比崩溃来说,获取一个透明的精灵可能更好一些
// this->release();
return false;
}
三、CCSpriteFrameCache
单例模型解决了纹理加载。一旦你的纹理被加载进来,下一次使用的时候它将会返回一个之前已经加载了的纹理的引用,而不是重新加载,这样就减少了GPU&CPU内存。
CCSpriteFrameCache单例是所有精灵帧的缓存。我们可以通过一个精灵片以及它的相关联的xml文件来将多个精灵加载进缓存中。从缓存里我们可以创建精灵对象。
纹理通常是一个里面包含着很多小的纹理的大图片。如下图片就是其中一个纹理。
有三种方式来加载纹理到CCSpriteFrameCache中:
1、一个xml(plist)文件
2、一个xml(plist)文件和一个纹理
3、一个CCSpriteFrame和一个精灵帧名字
(查看所有的apiCCSpriteFrameCache API)
四、示例代码:
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("family.plist", "family.png");
精灵图集能够帮助节省内存的原因是因为每次你想要去创建一个新的精灵的时候,你仅仅是获取精灵图集的管理图片,告诉它你想要获取的图片文件,它就会帮你复用之前的内存空间而不是重新再创建一个整个的新图片。