Cocos2d-x中的缓存

cocos2dx SpriteFrameCache 中遇到的加载问题 前些天和同事讨论优化资源加载这一块,比较熟悉的就是,SpriteBatchNode 和spriteFrameCache ,SpriteBatchNode 的原理是,在加载时候绘制出所有的节点,对于cocos lua和js的框架,这样的好处是调用c++的openGL的接口只需调用一次,就不用再游戏中再次绘制,重复调用openGL接口,这也是相对而言。之前的加载方案采用的是SpriteFrameCac... 阅读详情

cocos2d-x中有三个缓存类,在v2.x都是全局单例模式。

  • 纹理缓存(TextureCache)。使用纹理缓存可以创建纹理对象。
  • 精灵帧缓存(SpriteFrameCache)。能够从纹理图集(精灵表)中创建精灵帧缓存,然后再从精灵帧缓存中获得精灵对象,反复使用精灵对象时候,使用精灵帧缓存可以节省内存消耗。(如果将把图读入到精灵帧缓存中,同时也会把它加入到了纹理缓存里)
  • 动画缓存(AnimationCache)。动画缓存主要是用于精灵动画,精灵动画中的每一帧是从动画缓存中获取的。

    纹理缓存

    在游戏中需要加载大量的纹理图片,这些操作都是很耗内存和资源的。
    当游戏中有个界面要用到的图片非常多,第一次点进这界面时速度非常慢(因为要加载绘制很多图片)出现卡顿。我们可以使用TextureCache提前异步加载纹理,等加载结束,进入到这个界面再使用这些图片速度就会非常快。
    Texture2D:纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。
    TextureCache:纹理缓存,用于加载和管理纹理。一旦纹理加载完成,下次可以使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用。

  • 获取TextureCache
    在v3.x中,TextureCache不再作为单例模式使用。而是作为Director的成员变量。

Director::getInstance()->getTextureCache();
  • 获取纹理
    如果文件以前没有被加载,它会创建一个新的Texture2D对象,返回。
    addImage函数返回一个Texture2D的引用,可能是新加到内存的,也可能是以前已经存在的。
    Director::getInstance()->getTextureCache()->addImage(“icon.png”);
    两种方法获得缓存中的纹理。
Texture2D* texture=Director::getInstance()->getTexureCache()->addImage("icon.png");
Texture2D* texture=Direcot::getInstance()->getTexureCache()->getTextureForKey("icon.png");

通过getTextureForKey方法来获得这个key所对应的纹理缓存,如果这个Key对应的纹理不存在,那么就返回NULL。

  • 异步加载纹理
    TextureCache类还支持异步加载资源的功能,利用addImageAsync方法。异步加载图片,开辟一个新的线程专门用来加载图片,加载完毕后调用loadingCallBack函数。给addImageAsync方法添加一个回调方法,这样,当纹理异步加载结束的时候,可以得到通知。
    Director::getInstance()->getTextureCache()->addImageAsync(“icon.png”,this,callfuncO_selector(HelloWorld::loadingCallBack));
  • 清理缓存
    removeUnusedTextures则会释放当前所有的引用计数为1的纹理,即目前没有使用的纹理。比如新场景创建好后,使用此方法释放没有使用的纹理非常方便。
Director::getInstance()->getTextureCache()->removeUnusedTextures();

精灵帧缓存

感谢

http://www.tairan.com/archives/6378/

SpriteFrameCache主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示不同的图案。

SpriteFrameCache的内部封装了一个Map_spriteFrames对象。key为帧的名称。SpriteFrameCache一般用来处理plist文件(这个文件指定了每个文件的精灵在这张”大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。
添加精灵帧的配置文件一个plist文件和一张大的纹理图。

SpriteFrameCache的相关方法:
  • 获取单例的SpriteFrameCache对象。(单例模式)
SpriteFrameCache* cache=SpriteFrameCache::getInstance();
  • 销毁SpriteFrameCache对象。
SpriteFrameCache::destroyInstance();
  • 指定具体的坐标文件添加精灵帧。(Sheet.png那张大的纹理图)
cache->addSpriteFramesWithFile("Sheet.plist");
cache->addSpriteFramesWithFile("Sheet.plist","Sheet.png"); 
  • 使用SpriteFrameCache获取指定的精灵帧缓存中的精灵帧名来创建精灵对象。
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Sheet.plist");
auto frame_sp=Sprite::createWithSpriteFrameName("Sheet1.png");
this->addChild(frame_sp,0);
  • 指定具体的精灵帧名移除精灵帧。
void removeSpriteFrameByName(const std::string &name);
  • 清空精灵缓存。
void removeSpriteFrames();
  • 指定具体的坐标文件移除精灵帧。
void removeSpriteFramesFromFile(const std::string &plist);
  • 移除没有使用的精灵帧。
void removeUnuesdSpriteFrames();
SpriteFrameCache与TextureCache

与TextureCache功能一样,将SpriteFrame缓存起来,在下次使用的时候直接去取。不过与TextuteCache不同的是,如果内存池中不存在要查找的图片,它会提示找不到,而不会去本地加载图片。

TextureCache是底层也是最有效的纹理缓存,缓存的是加载到内存中的纹理资源,也就是图片资源。
SpriteFrameCache精灵帧缓存,缓存的是精灵帧。
SpriteFrameCache是基于TextureCache上的封装。缓存的是精灵帧,是纹理指定区域的矩形块。各精灵帧都在同一纹理中,通过切换不同的框帧来显示出不同的图案。

动画缓存

Animation:就是动画,存储一个动画动作需要的所有帧。

Animate:动画动作,就是一个动作类,继承自AnctionInterval类,我们可以通过Animation来创建一个Animate,然后再执行这个动作。

AnimationCache: AnimationCache类是一个单例类,用于缓存所有的动画和动画帧。通常情况下,对于一个精灵动画,每次创建都需要加载精灵帧,按顺序添加到数组,再创建对应的动画类。

  • 获取单例的AnimationCache对象
AnimationCache* cache=AnimationCache::getInstance();
  • 释放这个单个实例
AnimationCache::destroyInstance();
  • 添加动画文件到动画缓存中,plist文件
cache->addAnimationsWithFile("animations/animations-2.plist");
  • 添加一个Animation对象到缓存中,并指定一个名字。(0.1那个参数必须设定,可以设定除默认值以外的任何值,如果不设定,就无法播放Animate动作)
void addAnimation(Animation* animation,const std::string &name);
auto animation=Animation::createWithSpriteFrames(spriteFrameVec,0.1);
AnimationCache::getInstance()->addAnimation(animation,"dogs");
  • 根据动画名字从动画缓存中得到一个Animation对象,如果缓存中没有对应名字的Animation对象,则返回NULL。
Animation* getAnimation(const std::string &name);
auto animate=Animate::create(AnimationCache::getInstance()->getAnimation("dogs"));
关于cocoscreator中label的3种缓存的应用 使用CHAR类型之后,数据如下图GFX TexturMem中的纹理内存直接减半了,每帧渲染时间也恢复到了之前的1ms不到。该模式只能用于字体样式和字号(通过记录字体的 fontSize、fontFamily、color、outline 为关键信息,以此进行字符的重复使用,其他有使用特殊自定义文本格式的需要注意)固定,并且不会频繁出现巨量未使用过的字符的 Label。此时DrawCall变成了2(开启FPS,不显示label时是1),此时为开启任何缓存,CacheMode使用的是NONE。 阅读详情

相关推荐

Cocos2d-x Program笔记

Cocos2d-x与program相关的类有: GLProgram:包含Shader Compile,Uniform Cache,Attrib CacheGLProgramState:每一个GLProgram对象都有一个与之对应的GLProgramState用于Cache所有的State,包括:Uniform和Attrib 。当前版本没有完善此类,因此所有的Cache都还在GLProgr

blpnh的博客 2582

cocos2d-x中缓存总结

一开始感觉比较乱,后来查找了一些资料,整理了一下才感觉清晰了一些 一般我们都会涉及到加载图片,在游戏中需要加载大量的纹理图片,这些操作时很耗内存和资源的,所以最好是把图片加载到缓存中再 TextureCache(纹理缓存),用于加载和管理纹理。一旦纹理加载完成,下次使用时可使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用

u010450926的专栏 1349

cocos2d-x 2.2.3 CCTextureCache的addImage简单分析

CCTextureCache是用于缓存纹理的类,最常用的就是addImage了,下面简单分析下这部分的daiam

胡老哈的学习记录 4074

cocos2dx资源加载机制(同步/异步)

首先cocos2dx里的资源,有png,plist(pvr),exportjson(json)大致这三类,我们也从这3类去研究相应的加载代码。 本次代码分析基于: cocos2dx3.2 1、png png格式的资源,从sprite作为一个切入口来分析,一般Sprite的创建如下 Sprite* Sprite::create(const std

思考的智慧,知识源于思考 1万+

cocos2dx 自带库 spine v2.x缓存优化方案

在spine官方提供的代码中,没有提供动画文件的缓存处理,当同时加载多个动画的时候会卡帧,动画数据数量越大,卡得越厉害。为此,我们需要对官方提供的代码做一些优化: (注:可以把下面的代码类声明和实现都写在 namespace spine里面,这样和官方代码格式统一) 1.首先,在skeletonRender.h文件里添加一个缓存的单例类 class SpineDataCache { static ...

刀客 3608

Power BI应用案例:淘宝用户行为分析实战

一、案例背景 基于千万级的淘宝用户的使用记录,对淘宝用户的行为进行分析,具体指标包括:日PV、日UV、小时PV、小时UV、不同用户行为的PV、用户购买次数分布、用户购买频次分布、活跃用户消费情况等。通过本案例,可以基本看看Power BI都能分析达到怎么样的效果。 二、数据来源及结构 阿里天池官方发布的1万用户在2014年双十二期间的行为记录,数据量达1200万+。 数据下载地址:...

灰哥数据智能的专栏 1万+

cocos2d-x中的缓存CCTextureCache、CCSPriteFrameCache、CCAnimationCache

cocos2d-x中存在3个缓存类,都是全局单例模式。 1.CCTextureCache 首先是最底层也最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加一,保持不被清除,其cocos2d-x的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而到达重复使用,降低内存和CPU运算资源的

Write the code , change myself. 7214

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例)

本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。

weixin_30940783的博客 442

Cocos2d-x 3.2中的三种缓存类

Cocos2d-x 3.2中的三种缓存类 【前言】 Cocos引擎主要有三种缓存类: > 纹理缓存:TextureCache > 精灵帧缓存:SpriteFrameCache > 动画缓存:AnimationCache 缓存的目的就是:先将所需资源(如纹理图片)加载到内存中,之后再次使用该资源的时候,就可以直接从内存中取出,而不需要重新加载。从而减少了CPU和GPU...

追求卓越 495

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 682

深入解析 TDA4VM/VH R5F 核中断机制:VIC 与非 VIC 模式下的实战对比与优化

本文深入解析了TI TDA4VM/VH平台中ARMv7-R架构R5F核的两种中断处理机制:VIC模式与非VIC模式。通过对比硬件自动跳转与软件向量表分发的核心流程、实战代码示例及性能差异,为开发者提供了基于实时性、灵活性与调试需求的选择指南和优化建议,帮助构建更稳定的嵌入式系统。

weixin_29159441的博客 98

【cocos2d-x游戏开发】cocos中的三种缓存类

Cocos中有三种缓存类: (1):纹理缓存:TextureCache (2):精灵帧缓存:SpriteFrameCache (3):动画缓存:AnimationCache 游戏最要重要的就是流畅度,如果我们的游戏经常因为加载资源出现卡顿的情况,那么这个游戏就没有很好地游戏体验。所以,为了解决这个问题,缓存就应运而生了。 缓存的目的就是:现将所需资源加载到内存中,之后再次使用该资

活在阳光下 1793

DeepSeek跨会话协作指南:让AI成为你的「第二大脑」

通过DeepSeek的跨会话协作系统,用户实测工作效率提升63%。

紫夜若涵的博客 1473

【Cocos2d-x 3.x】 精灵帧缓存和纹理缓存

精灵帧缓存和纹理缓存学习。

Mccree的博客专栏 3113

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 335

连续相位调制通信调制方法的载波同步和定时同步研究及MATLAB仿真

本文将探讨CPM调制方法中的载波同步和定时同步问题,并提供MATLAB仿真源代码。本文讨论了连续相位调制通信中的载波同步和定时同步问题,并提供了相应的MATLAB仿真源代码。通过适当的载波同步和定时同步方法,可以实现对CPM信号的准确解调。希望本文对您理解连续相位调制通信调制方法的载波同步和定时同步问题有所帮助,同时也为您提供了一些MATLAB仿真实现的思路和示例代码。在CPM系统中,载波同步的主要任务是估计接收信号的载波频率偏移和相位偏移。在CPM系统中,常用的定时同步方法是基于自相关函数的峰值检测。

2301_79331230的博客 692

cocos2d-x CCSpriteFrameCache类使用总结

写这篇的出发点是因为我需要手动修改素材的像素,目前的接口要修改很容易,但是会造成内存管理,key冲突等问题,为了形成一个较优的方案,先研究下引擎自身的实现。 主要从缓存中的对象的产生->使用->回收角度来看,如果我描述的有什么问题,欢迎交流。 一、加载plist文件到内存 一般从plist加载到CCSpriteFrameCache使用该方法:void CCSpriteFrameCac

jusnxie的专栏 1588

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1290

Cocos2d-x缓存机制(一)

Cocos2d-x引擎提供3个缓存类,都是全局单例模式。 CCTextureCache 首先是最底层也是最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加1,保持不被清除,而Cocos2d-x的渲染机制是可以重复使用同一份纹理在不同场合中进行渲染,从而达到重复使用,降低内存和...

a1333001203377的博客 236

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

cocos2d-x中的单例

CCDirector (导演) 通过以下几个方法可以管理场景CCScene 1.void  runWithScene(CCScene * scene)    将场景入栈,并激活。(只适用于整个App的第一个CCScene) 2.void replaceScene(CCScene * scene) 新场景入栈,并激活,旧场景出栈并释放。 3.void push

u011909633的专栏 631

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

cocos2d-x SpriteFrameCache/TextureCache/AnimationCache

/*SpriteFrameCache*/ //通过plist和对应的png文件,把一批精灵添加到帧缓存中 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("fish.plist", "fish.png"); //从帧缓存中获取一个精灵 auto sp = Sprite::createWithSpriteFrameName(

lls2012的专栏 978

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

cocos2d-x 详解之 CCTexture2D(纹理图片)和 CCTextureCache(纹理缓存)

精灵和动画都涉及到纹理图片的使用,所以在研究精灵与动画之前,我们先来了解一下纹理图片类CCTexture2D和纹理缓存CCTextureCache的原理: 当一张图片被加载到内存后,它是以纹理的形式存在的。纹理是什么东西呢?纹理就是一块内存,这块内存中存放的是--按照指定的像素格式--填充的“图片像素信息”。它被最终作为三角面着色所依据的数据源。 -------...

weixin_30260399的博客 472
上一篇: Cocos2d-x中的精灵
下一篇: LeetCode332. Reconstruct Itinerary
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值