精灵性能优化-使用精灵帧缓存

精灵帧缓存是缓存的一种,缓存有如下几种:

纹理缓存(TextureCache)“。使用纹理缓存可以创建纹理对象,在上一节我们已经用到了。

精灵帧缓存(SriteFranmeCache)。能够从精灵表中创建精灵帧缓存,然后再从精灵帧缓存中获得精灵对象,反复使用精灵对象时候,使用精灵帧缓存可以节省内存消耗。

动画缓存(AnimationCache)。动画缓存主要用于精灵动画,精灵动画中的每一帧是从动画缓存中获取的。

这一个节我们主要介绍精灵帧缓存(SpriteFrameCache),要使用精灵帧缓存涉及到的类有:SpriteFrame和SpriteFrameCache。使用SpriteFrameCache创建精灵对象的主要代码如下:

         

 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist");                              ①
auto mountain1 =Sprite::createWithSpriteFrameName("mountain1.png");                                             ②

上述代码第①行是通过SpriteFrameCache创建精灵帧缓存对象,它是采用单例设计模式进行设计的,getInstance()函数可以获得SpriteFrameCache单一实例,addSpriteFramesWithFile函数是将精灵帧添加到缓存中,其中SpirteSheet.plist是坐标文件。我们可以多次调用addSpriteFramesWithFile函数添加更多的精灵帧到缓存中。

第②行代码Sprite::createWithSpriteFrameName("mountain1.png")是通过Sprite的createWithSpriteFrameName函数创建精灵对象,其中的参数mountain1.png是SpirteSheet.plist是坐标文件中定义的精灵帧名(见SpirteSheet.plist文件代码中的第②行)。

下面我们会通过一个实例介绍精灵帧缓存使用,这个实例如下图所示,在游戏场景中有背景、山和英雄三个精灵。

在HelloWorldScene.cpp实现的init函数代码如下:

bool HelloWorld::init()
{
   if ( !Layer::init() )
   {
       return false;
   }

   Size visibleSize = Director::getInstance()->getVisibleSize();
   Point origin = Director::getInstance()->getVisibleOrigin();

    autobackground = Sprite::create("background.png");                                                                 ①
    background->setAnchorPoint(Point::ZERO);
   this->addChild(background,0);

    SpriteFrameCache*frameCache = SpriteFrameCache::getInstance();                               ②
    frameCache->addSpriteFramesWithFile("SpirteSheet.plist");                                                      ③

   auto mountain1 =Sprite::createWithSpriteFrameName("mountain1.png");                              ④
    mountain1->setAnchorPoint(Point::ZERO);
   mountain1->setPosition(Point(-200,80));
   this->addChild(mountain1,0);

    SpriteFrame*heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");            ⑤
    Sprite*hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame);                                              ⑥
   hero1->setPosition(Point(800,200));
   this->addChild(hero1,0);

   return true;
}

上述代码第①行是创建一个背景精灵对象,这个背景精灵对象,并不是通过精灵缓存创建的,而是直接通过精灵文件直接创建的,事实上我们完全也可以将这个背景图片放到精灵表中。

第②行代码是获得精灵缓存对象。第③行代码是通过addSpriteFramesWithFile函数为精灵缓存中添加精灵帧。在前面的介绍中我们使用一条语句SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist")替代第②和第③行两条语句。在这里我们分成两条语句是因为后面我们还有使用frameCache变量。

第④行代码是使用Sprite 的createWithSpriteFrameName函数创建精灵对象,其中的参数是精灵帧的名字。

代码第⑤~⑥行是使用精灵缓存创建精灵对象的另外一种函数,其中第⑤行代码是使用精灵缓存对象frameCache的getSpriteFrameByName函数创建SpriteFrame对象,SpriteFrame对象就是“精灵帧”对象,事实上在精灵缓存中存放的都是这种类型的对象。第⑥行代码是通过精灵帧对象创建。第⑤和⑥行使用精灵缓存方式主要应用于精灵动画时候,相关的知识我们将在精灵动画部分介绍。

精灵缓存不再使用后忘记清空或移除相关精灵帧,否则如果有相同名称的精灵帧时候,就会出现一些奇怪的现象。清空或移除精灵帧的缓存函数如下:

pvoid removeSpriteFrameByName(conststd::string & name)。指定具体的精灵帧名移除。
pvoid removeSpriteFrames()。指定清空精灵缓存。
pvoidremoveSpriteFramesFromFile(const std::string & plist)。指定具体的坐标文件移除精灵帧。
pvoid removeUnusedSpriteFrames()。移除没有使用的精灵帧。

如果为了防止该场景中的精灵缓存对下一个场景产生影响,我们可以在当前场景所在层的onExit函数中调用这些函数,相关代码如下:

void HelloWorld::onExit()
{
    Layer::onExit();
    SpriteFrameCache::getInstance()->removeSpriteFrames();
}

onExit()函数是层退出时候回调的函数,与init函数类似都属于层的生命周期中的函数。我们要在h文件中定义,在cpp文件中声明。HelloWorld.h文件的相关代码如下:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
   … …
    virtualbool init();
        //退出Layer回调函数
        virtualvoid onExit();
   … …
   CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
当然精灵缓存清除工作也可以放到下一个场景创建时候,也就是下一个场景所在层的init函数中实现,相关代码如下:
bool HelloWorld::init()
{
   … …
   SpriteFrameCache::getInstance()->removeSpriteFrames();
   SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist");
   … …
}
 

 

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》

本书交流讨论网站:http://www.cocoagame.net

欢迎加入cocos2d-x技术讨论群:257760386、327403678

时间: 2024-05-22 03:52:21

精灵性能优化-使用精灵帧缓存的相关文章

ASP.NET性能优化之让浏览器缓存动态网页的方法_实用技巧

OutputCache是针对所有访问服务器资源的用户,本篇要介绍的浏览器缓存则是针对单个用户,让浏览器在我们的控制下彻底不持续访问服务器上的动态内容,也就是我们要让浏览器变成我们的缓存机制中的一部分,在某些特定的场景下最大化地提升ASP.NET站点的性能.如果说OutputCache是从广度上提升并发效率,则浏览器缓存是从深度上提升效率. 一:HTTP头简介 1.1浏览器第一次请求 假设我们请求一个URL地址,譬如我服务器上的一个静态页面http://192.168.0.77/luminji2/

ASP.NET 性能优化之反向代理缓存使用介绍_实用技巧

到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish.这两款软件通常都部署在非WINDOWS平台上,对于Windows平台上的Asp.net来说,其实一样能使用,我们完全可以把反向代理软件部署在LINUX上,然后代理会路由到后台的WINDOWS WEB(IIS)服务器.总之,非WINDOWS的世界很精彩. 当然,无论是squid还是

Web网站性能优化的相关技术

中介交易 SEO诊断 淘宝客 云主机 技术大厅 Web站点性能问题吸引或者迫使越来越多的人投入到这个问题的研究中来,产生了很多解决方案.下面是我根据自身的理解对这些技术进行了归类总结,如有不足之处欢迎拍砖. 一.提高服务器并发处理能力 我们总是希望一台服务器在单位时间内能处理的请求越多越好,这也成了web服务器的能力高低的关键所在.服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计,使得多个任务可以轮流使用系统资源,这些资源包括CPU.内存以及I/O等.这就需要选择一个合适的并发

【Cocos2d-x】Cocos2d-x精灵的性能优化

Cocos2d-x精灵的性能优化-使用纹理图集和精灵帧缓存 使用纹理图集 纹理图集(Texture)也称为精灵表(Sprite Sheet) 使用纹理图集的优点: 1.减少文件读取次数,读取一张图片比读取一推小文件要快 2.减少OpenGL ES绘制调用并且加速渲染 OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片(即宽度或者高度是2.4.8.64-). 如果采用小图片OpenGL ES1.1会分配给每个图片2的n次幂大小的内存空间,即使这张图片达不到这样的宽度和高度也会分配大于此图片

精灵的优化-使用纹理图集

游戏是一种很耗费资源的应用,特别是在移动设备中的游戏,性能优化是非常重要的   纹理图集(Texture Atlas)也称为精灵表(Sprite Sheet),它是把许多小的精灵图片组合到一张大图里面.使用纹理图集(或精灵表)有如下主要优点: 减少文件读取次数,读取一张图片比读取一堆小文件要快. 减少OpenGL ES绘制调用并且加速渲染. 减少内存消耗.OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片(即宽度或者高度是2.4.8.64...).如果采用小图片OpenGL ES1.1会

前端工程与性能优化之静态资源版本更新与缓存

每个参与过开发企业级web应用的前端工程师或许都曾思考过前端性能优化方面的问题.我们有雅虎 14条性能优化原则,还有两本很经典的性能优化指导书:<高性能网站建设指南>.<高性能网站建设 进阶指南>.经验丰富的工程师对于前端性能优化方法耳濡目染,基本都能一一列举出来.这些性能优 化原则大概是在7年前提出的,对于web性能优化至今都有非常重要的指导意义. 然而,对于构 建大型web应用的团队来说,要坚持贯彻这些优化原则并不是一件十分容易的事.因为优化原则中很多 要求是与工程管理相违背的

秋色园QBlog技术原理解析:性能优化篇:字节、缓存、并发(十二)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建

MySQL数据库性能优化之缓存参数优化

在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助. 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO.本文先从

[Android]ListView性能优化之视图缓存(续)

前言 在上一篇ListView性能优化之视图缓存我们讨论了Google I/O中的优化方法,在各个论坛发帖后得到了不错的反馈,诸如:使用ViewHolder技术Tag的问题,利用HashMap自行存储的方案等.这里结合新浪微博中主界面的做法及测试数据与大家进一步探讨.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com    文章 [Android]ListView性能优化之视图缓