工作特别忙,哎!都想辞工了。好不容易放两天假呢,窝在家玩游戏,撸啊撸,那叫一个天昏地暗啊
好了,今天来看看Cocos2d-x的三种缓存
TextureCache
SpriteFrameCache
AnimationCache
还有一个贴图工具TexturePacker
1.TextureCache
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSprite* pSprite = CCSprite::create("Icon.png");
pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
this->addChild(pSprite, 0);
我们创建了一个精灵,跟踪进去看看
CCSprite* CCSprite::create(const char *pszFileName)
{
CCSprite *pobSprite = new CCSprite();
if (pobSprite && pobSprite->initWithFile(pszFileName))
{
pobSprite->autorelease();
return pobSprite;
}
CC_SAFE_DELETE(pobSprite);
return NULL;
}
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 then a crashed program
// this->release();
return false;
}
这里有句CCTextureCache::sharedTextureCache()->addImage(pszFilename)
可以看出来TextureCache是单例的,我们在到addImage方法中看看
有这么一句
texture = (CCTexture2D*)m_pTextures->objectForKey(pathKey.c_str());
这个m_pTextures是一个键值对的字典,CCTextureCache的成员变量,它存储了整个程序中的纹理缓存
这句话是从这个字典中通过以文件名为键去获取其值
if (! texture)
{
判断获取到的纹理是否为空
不为空就直接返回了
为空的话,if里面的东西看不懂,总之就是通过文件名将盘符下面的文件以流的形式加载到内存
最后在来上了这么一句
m_pTextures->setObject(texture, pathKey.c_str());
将图片存入缓存中
下次如果再用这张图片的话就直接读了,应为textures已经不为空了
大家可以在
if (! texture)
{
设置一个断点,然后创建两个精灵,两个精灵用同一张图片试试,看它第二个精灵创建的时候是否进入if里面
不管你们试不试,反正我是试了。初学者嘛,一步一个脚印
上面一点的地方我是不是贴了initWithFile的这个方法的代码??
我们分析下来,它将图片加载到缓存,然后返回CCTexture2D的东西,在通过这个纹理来创建精灵的
我们也来试试
CCTextureCache* pTextureCache= CCTextureCache::sharedTextureCache();
CCTexture2D* pTexture=pTextureCache->addImage("Icon.png");
CCSprite* pSprite = CCSprite::createWithTexture(pTexture);
pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
this->addChild(pSprite, 0);
首先我们获得纹理缓存
在将图片加入缓存,返回一个纹理图片
在通过createWithTexture来创建精灵
ok,这是目前为止我们第二种创建精灵的方式了
掌握了吗??
至于哪种效率更高,其实效率是一样的,create创建的话在底层也是通过纹理2D创建的
2.SpriteFrameCache
翻译过来,精灵帧缓存,其实和纹理缓存差不多
一个区别:
纹理缓存,在缓存中没有数据,它将读取图片到内存,然后保存到TexturesCache中,方便下次使用
精灵帧缓存,如果缓存中没有,直接报错
好的,在介绍这个之前我们先来学习一个工具
TexturesPackger
这个不免费的,红色圈起来的是使用七天,最右边的是免费版,
免费版使用起来图片会变成红色,这里我们用的使用七天的
听说进这个链接
把表单填了过个几天,作者会发KEY给你,我刚填了,抱着试试的心态
好了 看到工具栏的add Sprites吗?
我们将图片添加进来
其他左边的配置就让它默认吧,这里不做解释了
然后,工具栏Publish
设置好你要保存的路径,
0个错误0个警告
OK
//获得精灵帧缓存
CCSpriteFrameCache* pSpriteFrameCache= CCSpriteFrameCache::sharedSpriteFrameCache();
//将plist文件和图片加入缓存
pSpriteFrameCache->addSpriteFramesWithFile("myplist.plist","myplist.png");
//创建精灵
CCSprite* pSprite= CCSprite::createWithSpriteFrameName("Icon.png");
//或者
//CCSprite* pSprite= CCSprite::createWithSpriteFrame(pSpriteFrameCache->spriteFrameByName("Icon.png"));
pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
this->addChild(pSprite, 0);
这是我们第三种创建精灵的方式 有么有啊
其实效率上来讲都差不多,但是第三种用到plist文件,这样可以节省很多空间,我更喜欢第三种
3,AnimationCache
上一次我们讲解了动画,还记得吧
首先创建ccanimation
然后循环将精灵图片加入到CCAnimation中
设置间隔时间
设置播放完毕后是否回到第一帧
在创建CCAnimate
精灵执行动画
想想,每次执行这个动画,先不说效率上,不停的创建渲染,就是这步骤,我们都累的够呛的了
我们可以创建一次动画,
在将其存入动画缓存中
下次再用相同的动画直接读取缓存中的就可以了
CCAnimationCache* pAnimationCache= CCAnimationCache::sharedAnimationCache();
pAnimationCache->addAnimation();
addAnimation,有两个参数
参数1:你的动画
参数2:动画名称(类似于键值对的字典)
pAnimationCache->animationByName()
根据名称获得动画
4.CCSpriteBatchNode
这是一个精灵节点包,主要用于批次渲染的,假设我们做一个微信飞机大战,子弹神马的那么多,如果还用以前的方式创建子弹精灵的话,效率会很低。FPS是什么东东我也不清楚,还是先看看效果吧
这里渲染了9000个精灵,FPS只有30多了,平常FPS是60的,一秒60次,现在一秒只能执行38次
这样子效率就高很多了
我们分析一下,首先我们创建了CCSpriteBatchNode
在给它设置一个位置,增加到层中
我们可以把CCSpriteBatchNode看做一个虚拟的东西,它是一个精灵的父节点
最后我们在循环里面我们是将创建的精灵添加到CCSpriteBacheNode中的 这个一定要注意
还有一个注意点: 就是我们所创建的精灵图片必须要是CCSpriteBatchNode中的图片 不然也会出错的
所以我们介绍了TexturesPackager工具
这样我们就能避免那个问题的存在了,
还有个好消息告诉大家,昨天我再里面填的表单,今天作者已经把KEY给偶了,作者是个 好淫 啊
呵呵!总结一下,
我们介绍了三种缓存用法都差不多 (CCTexturesCache、CCSpriteFrameCache、CCAnimationCache)
顺带创建精灵的三种方式 (createWithTextures()、createWithSpriteFrame()、 create() )
还介绍了CCSpriteBatchNode (批次渲染:准备,渲染,渲染....渲染,清除。 普通渲染:准备,渲染,清除。准备,渲染,清除。...准备,渲染,清除)
注意CCSpriteBatchNode的用法和注意事项
还有一个工具 TexturesPackager
最后 有个网址 填写表单后 作者会回复KEY给你 好淫一身平安啊