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

简介: <p><span style="font-size:14px;">精灵帧缓存是缓存的一种,缓存有如下几种:</span></p><p><span style="font-size:14px;">纹理缓存(TextureCache)“。使用纹理缓存可以创建纹理对象,在上一节我们已经用到了。</span></p><p><span style="font-size:14px;">精灵帧缓存(Sr

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

纹理缓存(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

目录
相关文章
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
1903 0
|
1月前
|
缓存 并行计算 监控
vLLM 性能优化实战:批处理、量化与缓存配置方案
本文深入解析vLLM高性能部署实践,揭秘如何通过continuous batching、PagedAttention与前缀缓存提升吞吐;详解批处理、量化、并发参数调优,助力实现高TPS与低延迟平衡,真正发挥vLLM生产级潜力。
409 0
vLLM 性能优化实战:批处理、量化与缓存配置方案
|
5月前
|
缓存 负载均衡 网络协议
电商API接口性能优化技术揭秘:缓存策略与负载均衡详解
电商API接口性能优化是提升系统稳定性和用户体验的关键。本文聚焦缓存策略与负载均衡两大核心,详解其在电商业务中的实践。缓存策略涵盖本地、分布式及CDN缓存,通过全量或部分缓存设计和一致性维护,减少后端压力;负载均衡则利用反向代理、DNS轮询等技术,结合动态调整与冗余部署,提高吞吐量与可用性。文中引用大型及跨境电商平台案例,展示优化效果,强调持续监控与迭代的重要性,为电商企业提供了切实可行的性能优化路径。
|
8月前
|
存储 缓存 NoSQL
Redis缓存设计与性能优化
Redis缓存设计与性能优化涵盖缓存穿透、击穿、雪崩及热点key重建等问题。针对缓存穿透,可采用缓存空对象或布隆过滤器;缓存击穿通过随机设置过期时间避免集中失效;缓存雪崩需确保高可用性并使用限流熔断组件;热点key重建利用互斥锁防止大量线程同时操作。此外,开发规范强调键值设计、命令使用和客户端配置优化,如避免bigkey、合理使用批量操作和连接池管理。系统内核参数如vm.swappiness、vm.overcommit_memory及文件句柄数的优化也至关重要。慢查询日志帮助监控性能瓶颈。
329 9
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存与性能优化
【5月更文挑战第14天】 在动态语言的世界里,PHP一直因其高性能的执行效率和广泛的社区支持而备受青睐。随着Web应用的复杂性增加,对性能的要求也越来越高。本文将探讨PHP的Opcode缓存机制,解析其对性能提升的贡献,并展示如何通过配置和使用不同的Opcode缓存方案来进一步优化PHP应用的性能。我们将深入到PHP的核心,了解Opcode是如何生成的,以及它如何影响最终的执行效率。
|
存储 缓存 监控
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
474 1
|
存储 缓存 自然语言处理
深入PHP内核:Opcode缓存与性能优化
【5月更文挑战第31天】 在提升PHP应用性能的众多策略中,Opcode缓存技术以其显著的性能提升效果而广受关注。本文旨在深入探讨PHP的Opcode缓存机制,解析其对性能提升的影响,并讨论如何通过配置和优化实践来充分利用Opcode缓存。文章将首先介绍Opcode的概念及其在PHP执行过程中的作用,然后分析几种流行的Opcode缓存解决方案,最后提供针对性的优化建议,帮助开发者实现高效的PHP应用。
|
存储 缓存 NoSQL
Redis缓存设计与性能优化(一)
Redis缓存设计与性能优化(一)
|
存储 缓存 NoSQL
Redis--缓存设计与性能优化
Redis--缓存设计与性能优化
207 0
下一篇
oss云网关配置