`
zani
  • 浏览: 354529 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Cocos2d-x 缓存机制:预加载与重复使用

 
阅读更多

缓存在软硬件设计中是一个十分常见的优化方法,多用于高性能软硬件的设计。简单地说,缓存就是利用存储器的速度等级差异,将低速存储中使用频率高的内容加载到高速存储中,这样可以有效提高访问速度。比如将常用的图片资源从磁盘读到内存,将常用的程序段从内存搬到CPU的高速缓存中。

 

移动设备比较常用的是外存到内存的缓存。尽管大部分手机使用闪存作为外部存储已经比PC上磁盘的速度快得多,但相比内存而言还是差了两到三个数量级。从闪存内读取一张图片平均会耗费接近0.1秒的时间,这样反复加载将占用非常多的系统资源。而缓存机制可以预先加载我们需要的内容到内存,并且在之后的操作中重复使用。

 

缓存空间毕竟有限,每一个缓存都应该实现合理的换入换出机制来保证缓存中的内容确实是最需要被反复利用的。同时,缓存应该尽量透明化,也就是说,在不主动调用的情况下缓存就应该生效。幸运的是,我们不需要自己实现缓存,因为Cocos2d-x已经为我们提供了足够强大的实现。引擎中存在3个缓存类,都是全局单例模式。

 

1 CCTextureCache

首先是最底层也最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加一,保持不被清除,而Cocos2d-x的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而达到重复使用,降低内存和GPU运算资源的开销的目的。常用的是如下所示的3个

1 static CCTextureCache* sharedTextureCache(); //返回纹理缓存的全局单例
2 CCTexture2D* addImage(const char* fileimage); //添加一张纹理图片到缓存中
3 void removeUnusedTextures(); //清除不使用的纹理

在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTexture2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。后面会看到,引用计数的内存管理方式为缓存的设计带来了很大的便利。

在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTexture2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。后面会看到,引用计数的内存管理方式为缓存的设计带来了很大的便利。

 

2 CCSpriteFrameCache

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

CCSpriteFrameCache的常用接口和CCTextureCache类似,不再赘述了,唯一需要注意的是添加精灵帧的配套文件-- 一个plist文件和一张大的纹理图。下面列举了CCSpriteFrame Cache常用的方法:

1 static CCSpriteFrameCache* sharedSpriteFrameCache(void); //全局共享的缓存单例
2 void addSpriteFramesWithFile(const char *pszPlist); //通过plist配置文件添加一组精灵帧
3 void removeUnusedSpriteFrames(void); //清理无用缓存

 

3 CCAnimationCache

最后一个是CCAnimationCache动画的缓存。通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺序添加到数组,再创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率高的动画,比如鱼的游动,将其加入缓存可以有效降低每次创建的巨大消耗。由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单明了的,如下所示:

1 static CCAnimationCache* sharedAnimationCache(void);//全局共享的缓存单例
2 void addAnimation(CCAnimation *animation, const char * name);//添加一个动画到缓存
3 void removeAnimationByName(const char* name);//移除一个指定的动画
4 CCAnimation* animationByName(const char* name);//获得事先存入的动画

唯一不一样的是,这次动画缓存需要我们手动维护全部动画信息。也因为加载帧动画完全是代码操作的,目前还没有配置文件指导,所以不能像另外两个缓存那样透明化。实际上,如果考虑到两个场景间使用的动画基本不会重复,可以直接清理整个动画缓存。

所以,在场景切换时我们应该加入如下的清理缓存操作:

1 void releaseCaches()
2 {
3     CCAnimationCache::purgeSharedAnimationCache();
4      CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames();
5     CCTextureCache::sharedTextureCache()->removeUnusedTextures();
6 }

值得注意的是清理的顺序,应该先清理动画缓存,然后清理精灵帧,最后是纹理。按照引用层级由高到低,以保证释放引用有效。

分享到:
评论

相关推荐

    cocos2d-x 3.x游戏开发实战光盘

    4. **资源管理**:加强了资源加载和管理机制,支持资源预加载和缓存,提高了资源加载效率。 5. **事件系统**:重构了事件系统,使其更加灵活和强大,支持多层事件监听和处理。 6. **动画系统**:引入了新的动画...

    cocos2d-x-Introduction.zip_cocos2d_cocos2d-x

    cocos2d-x提供了多种性能优化手段,如批次绘制、纹理 atlasing、预加载机制等,确保游戏在不同设备上都能流畅运行。 十、社区支持 cocos2d-x拥有庞大的开发者社区,提供了丰富的教程、示例代码、插件和第三方库,...

    地球人己阻止不了程序猿们学习cocos2d-x了-学习笔记04 .源码

    Cocos2d-x提供了丰富的资源加载和缓存机制,源码中会展示如何有效地使用这些工具。 通过深入研究"FlyGame"的源码,程序员不仅可以提升Cocos2d-x的使用技巧,还能了解到游戏开发中的常见设计模式和最佳实践。在学习...

    cocos2d-x异步加载plist

    1. **DataCache**:这是cocos2d-x内部提供的一种缓存机制,它可以异步地加载和存储数据,包括plist文件。通过DataCache,开发者可以避免在主线程中进行耗时的I/O操作,从而保持游戏的流畅性。 2. **AssetManager**...

    Cocos2D-x权威指南

    Cocos2D-x提供了资源缓存和预加载机制,帮助你优化资源加载和内存使用。通过实例,你可以学习最佳的资源管理策略。 书中示例涵盖了上述各个方面的内容,每一份代码都是为了让你更好地理解和应用Cocos2D-x的关键特性...

    cocos2d-x-4.0.zip

    资源预加载和缓存策略的改进,使得游戏启动速度更快,玩家等待时间减少。同时,资源打包工具的优化,使得资源组织和打包更为便捷,简化了开发流程。 最后,Cocos2d-x 4.0的社区支持依然强大。官方文档全面详尽,...

    cocos2d-x_wiki

    《cocos2d-x_wiki》是针对cocos2d-1.0.1-x-0.11.0版本的官方wiki文档,以PDF格式呈现,为开发者提供了丰富的cocos2d-x游戏开发知识。cocos2d-x是一个开源的游戏开发框架,广泛应用于跨平台2D游戏开发,支持iOS、...

    Cocos2D-X跨平台游戏引擎.zip

    它可以处理各种类型的资源,如图片、音频、字体等,并支持资源的预加载和缓存,确保游戏运行流畅。 Cocos2D-X还支持事件处理和用户输入,让开发者能够方便地响应用户的触摸、按键等操作。同时,它还提供了强大的...

    Cocos2d-x预编译配置

    在使用Cocos2d-x进行项目开发时,预编译配置是一个关键环节,能够显著提升开发效率,减少编译时间和避免不必要的重复编译工作。 预编译配置的核心目的是优化构建过程,它通过预先编译部分不经常变动的代码和资源,...

    cocos2d-x 游戏关卡选择的设计

    一、Cocos2d-x与关卡设计 在cocos2d-x中,关卡设计通常涉及以下几个关键方面: 1. **数据结构**:首先,你需要定义一个数据结构来存储关卡信息,如关卡编号、难度等级、解锁条件等。这可以是一个简单的数组或更复杂...

    cocos2d-x 泡泡堂图片资源

    7. **性能优化**:为了保证游戏在不同设备上的流畅运行,开发者需要关注纹理压缩、资源预加载、绘制调用优化等方面,合理利用cocos2d-x提供的工具和技巧。 总之,这份“泡泡堂图片资源”为cocos2d-x开发者提供了...

    cocos2d-lua 贪吃蛇

    cocos2d-x支持资源预加载、缓存和释放,lua可以调用相关API进行资源的加载和使用,确保游戏运行流畅。 6. **性能优化**:由于描述中提到游戏存在一些问题需要优化,这可能涉及到帧率控制、内存管理、减少冗余计算等...

    知易Cocos2D-iPhone开发教程

    8. **资源管理**:Cocos2D-iPhone提供了高效的资源加载和缓存机制,方便开发者管理图像、音频和其他资源。 9. **Tiled地图编辑器支持**:Cocos2D-iPhone可以与Tiled地图编辑器配合使用,创建复杂的2D关卡地图。 10...

    Cocos2d-x 3.2 大富翁游戏项目开发-第九部分 代码部分优化

    在本教程中,我们将深入探讨使用Cocos2d-x 3.2框架进行大富翁游戏项目开发的代码部分优化。Cocos2d-x是一个广泛使用的开源游戏开发库,尤其适用于2D游戏,它提供了丰富的功能和高性能的图形渲染能力。在游戏开发过程...

    水果忍者切西瓜 fruitninja 适配cocos2dx-2.1.2

    《水果忍者切西瓜在Cocos2d-x框架下的重构与适配》 "水果忍者切西瓜"是一款广受欢迎的休闲游戏,以其简单的操作和趣味性吸引了大量玩家。本项目是将这款经典游戏移植到Cocos2d-x 2.1.2版本的过程,旨在帮助开发者...

    简易示例Cocos2dXEdit

    - 图片、音频和字体文件通常需要在Cocos2d-x中预加载,以便在游戏运行时能快速访问。 - 使用纹理 atlas 和plist 文件来优化资源加载和内存使用。 4. **调试与性能优化**: - 在MFC环境下,调试Cocos2d-x代码可能...

    cocos2d-0.4.0 for iphone

    Cocos2d提供了资源加载和缓存机制,方便管理和复用资源,如图片、音频文件和XML配置文件,避免不必要的内存开销。 9. **事件处理**: 它有一个强大的事件系统,用于处理触摸事件、键盘输入和游戏特定的事件,如...

    iOS游戏应用源代码——05bit-cocos2d-TalkingPet-64991af.zip

    Cocos2d提供了一套资源管理机制,如纹理 atlases 和预加载,确保资源的高效加载和释放。 6. **物理引擎**:虽然《Talking Pet》可能不涉及复杂的物理模拟,但Cocos2d集成的物理引擎(如Box2D)可以用于实现碰撞检测...

    CocosForWin-v3.10

    在压缩包中,"CocosStudio_v3.10.exe"是Cocos Studio的安装程序,它是与Cocos2d-x配合使用的图形化工具,可以帮助开发者快速创建游戏场景、UI界面和动画。通过这个工具,开发者可以减少编写代码的时间,更加专注于...

    国王保卫战小游戏源码,cocos小游戏

    Cocos2d-x提供了一个资源管理系统,源码会展示如何预加载资源、缓存和释放它们,以优化内存使用。 7. **游戏逻辑**:国王保卫战可能包含战斗系统、敌人AI、升级机制等复杂逻辑。源码会揭示如何编写这些逻辑,包括...

Global site tag (gtag.js) - Google Analytics