您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x 纹理缓存(Texture Cache)

2016-07-14 15:08 561 查看

简介

纹理缓存是将纹理缓存起来方便之后的绘制工作。每一个缓存的图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中的,不用在每一次绘制的时候都发送给GPU。

CCTextureCache

当你创建一个精灵,你一般会使用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);
}

// don't release here.
// when load texture failed, it's better to get a "transparent" sprite than a crashed program
// this->release();
returnfalse;
}


上面代码显示一个单例在控制加载纹理。一旦这个纹理被加载了,在下一时刻就会返回之前加载的纹理引用,并且减少加载的时候瞬间增加的内存。

CCSpriteFrameCache

CCSpriteFrameCache单例是所有精灵帧的缓存。使用spritesheet和与之相关的xml文件,我们可以加载很多的精灵帧到缓存中,那么之后我们就可以从这个缓存中创建精灵对象了。

和这个xml相关的纹理集一般是一个很大的图片,里面包含了很多小的纹理。下面就是一个纹理集的例子:

有三种方式来加载纹理集到CCSpriteFrameCache中:

加载一个xml(plist)文件

加载一个xml(plist)文件和一个纹理集

通过CCSpriteFrame和一个精灵帧的名字

具体完整API请看CCSpriteFrameCache API。

示例:

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();

cache->addSpriteFramesWithFile(“family.plist”, “family.png”);


CCSpriteBatchNode

CCSpriteBatchNode渲染所有的子节点只需要一次,只需要调用一次draw。那就是为什么你需要把精灵加载batch node的原因,因为可以统一一起渲染。但是只有这个精灵使用的纹理包含在batch node中的才可以添加到batch node上,因为batch node一次只渲染这相同的纹理集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: