Cocos2D-X2.2.3学习笔记16(缓存机制)

工作特别忙,哎!都想辞工了。好不容易放两天假呢,窝在家玩游戏,撸啊撸,那叫一个天昏地暗啊


好了,今天来看看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给你     好淫一身平安啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值