【Cocos2d-x】Cocos2d-x精灵的性能优化
Cocos2d-x精灵的性能优化-使用纹理图集和精灵帧缓存 使用纹理图集纹理图集(Texture)也称为精灵表(Sprite Sheet) 使用纹理图集的优点: bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto background = Sprite::create("background.png");
background->setAnchorPoint(Vec2::ZERO);
this->addChild(background,0);
auto mountain1 = Sprite::create("SpriteSheet.png",Rect(2,391,934,388));//截取图片
mountain1->setAnchorPoint(Vec2::ZERO);//设置锚点
mountain1->setPosition(Vec2(-200,80));//设置坐标
this->addChild(mountain1,0);
Texture2D* cache = Director::getInstance()->getTextureCache()->addImage("SpriteSheet.png");//加载整个图片到纹理缓存
auto hero1 = Sprite::create();
hero1->setTexture(cache);
hero1->setTextureRect(Rect(2,1706,327));//在纹理缓存中截取图片 左上角坐标 以及截取图片的宽高
hero1->setPosition(Vec2(800,200));
this->addChild(hero1,0);
return true;
}
源代码下载地址:GITHUB源码下载地址: 【点我进行下载】 精灵帧缓存精灵帧缓存是缓存的一种,缓存有如下几种: 3、动画缓存(AnimationCache) SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();
frameCache->addSpriteFramesWithFile("SpriteSheet.plist");
//单例-将精灵图集的坐标读进去 根据这个坐标获取图集,这个加载过程是在游戏启动的时候加载,并不是在用的时候加载(肯定会占用很多内存的,不过现在手机一般内存都挺多的)
auto mountain1 = Sprite::createWithSpriteFrameName("mountain1.png");//缓存被创建后,可以通过frame名字(**注意名字冲突的问题,名字一样的精灵帧,后面的会覆盖前面的,可以加前缀以区分**)指定精灵帧来创建一个精灵 这个过程并不是通过大图去创建的,而是通过SpriteFrameCache缓存取出来的,这个速度很快
//还可以通过精灵帧来创建精灵
SpriteFrame *heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");//通过精灵帧名字获取精灵帧
Sprite *hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame);//通过精灵帧创建精灵
清空或移除精灵帧的缓存函数: void removeSpriteFrameByName(const std::string& name);//指定具体的精灵帧名将精灵帧从缓存中移除,具体到精灵帧
void removeSpriteFrames();//指定清空所有的精灵帧缓存
void removeSpriteFramesFromFile(const std::string& plist);//指定具体的坐标文件(plist文件)移除精灵帧
void removeUnusedSpriteFrames();//移除没有使用的精灵帧
建议初学者不要轻易使用清除缓存函数! 小项目实例现在还做不了太复杂的项目,在目前这个阶段 背景没有放到精灵图集中去,这是因为背景是不需要透明的 bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto background = Sprite::create("background.png");//加载背景精灵
background->setAnchorPoint(Vec2::ZERO);
this->addChild(background,0);
SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();//单例对象
frameCache->addSpriteFramesWithFile("SpriteSheet.plist");//加载精灵图集
auto mountain1 = Sprite::createWithSpriteFrameName("mountain1.png");//通过精灵帧名创建精灵
mountain1->setAnchorPoint(Vec2::ZERO);//设置锚点
mountain1->setPosition(Vec2(-200,80));
this->addChild(mountain1,0);
SpriteFrame *heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");//通过精灵帧名字获取精灵帧
Sprite *hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame);//通过精灵帧创建精灵
//上面的两条语句相当于前面一条语句的效果auto mountain1 = Sprite::createWithSpriteFrameName("mountain1.png");
hero1->setPosition(Vec2(800,0);
return true;
}
源代码下载地址:GITHUB源码下载地址: 【点我进行下载】 本文章由[谙忆]编写, 所有权利保留。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |