cocos2dx内存优化 (之二)

一、cocos2dx之如何优化内存使用(高级篇)

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93

一、内存优化原则

为了优化应用内存,你应该知道是什么消耗了你应用的大部分内存,答案就是Texture(纹理)!它几乎占据了90%的应用内存。那么我们应该尽力去减小我们应用的纹理内存使用,否则我们的应用进程可能会被系统杀死。

为了减少内存警告,这里我们给出两个普遍的关于cocos2dx游戏内存优化的指导原则。

1)了解瓶颈,然后解决掉

什么样的纹理消耗了大部分应用的内存呢?或者说这些纹理消耗了多少内存呢?你不用去手工计算或者猜测。

这里我们正好有一个工具。它就是苹果的开发工具- Allocations & Leaks,在xcode中你长按Run按钮并且选择Profile去启动这两个工具。这里我们有个截图:

你可以使用Allocation工具去计算你应用的内存使用情况并且可以查看内存泄露情况。

你也可以用一些代码去获取游戏内存使用的一些有用的信息。

如下代码即可:

[cpp] view plain copy
  1. CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();

如下所示:当你调用这些代码并且在DEBUG模式运行你的游戏的时候,在你的xcode console窗口你将会看到一些格式化的log信息

[cpp] view plain copy
  1. Cocos2d:cocos2d:"cc_fps_images"rc=5id=3256x32@16bpp=>16KB
  2. Cocos2d:cocos2d:"XXX/hd/actor.pvr.ccz"rc=1059id=42048x2048@32bpp=>16384KB
  3. Cocos2d:cocos2d:CCTextureCachedumpDebugInfo:2textures,for16400KB(16.02MB)

这些log显示了纹理的名字,引用数,id,大小以及像素的bit值,最重要的是它展示了内存使用情况。如上cc_fps_images消耗了16KB,actor.pvr.ccz消耗了16M内存。

2)不要过度优化

这是一个常规的优化规则。当你进行内存优化的时候,你应当进行一下权衡。因为有时图片质量和图片内存使用情况是相反的两边。所以千万不要过度优化。

二、内存优化等级

这里我们把cocos2dx内存优化划分成三个等级。在每个等级,我们有不同观点并且策略也是有些变化。

1、cocos2dx客户端等级

这是我们可以关心的最重要的优化等级。因为我们在cocos2dx引擎上开发游戏,引擎自己就提供了很多可选择的优化方案。在这个等级上,我们可以做的工作最多。

首先,让我们看一下纹理优化

为了优化纹理内存的使用,我们必须知道什么因素影响了内存的使用情况。

有三个因素影响了纹理的内存使用。纹理格式(压缩的还是非压缩的),颜色,大小。

我们可以使用PVR格式的纹理来减少内存使用。最被建议的纹理格式是pvr.ccz,每色的bit值越高,画面质量就约好。但是也会消费很多内存。

那么我们使用颜色深度是RGBA4444的纹理来代替RBGA8888,这将会消费一半内存。

我们也会发现大纹理也会导致内存相关的问题。那么你最好使用适度的大小。

其次,让我们做一些关于声音的事情

有三个因素影响文件内存使用。是音频文件格式,比特率,和样本率

我们最希望音频文件时mp3格式。因为它被android和ios都支持。并且它也被压缩并且硬件加速了。

你应该保证你的背景音乐文件大小在800KB一下。最简单的方式就是减少背景音乐播放时间并且重复调用。

你应该保持你的音频文件样本率在96-128kbps之间,并且比特率在44kHz就足够了。

最后,我们谈谈字体和粒子系统优化。

这里我们有两个建议:当使用BM字体显示游戏分数,在你的图片文件中选择最小的数字字符,例如:

如果你想只显示数字,你可以移除所有的字符。

粒子系统中,我们可以减少粒子数量来减少内存使用。

2、cocos2dx引擎等级

如果你不擅长OpenGLES和游戏引擎内核,你可以把这部分留个引擎开发者。如果你是一个开源游戏引擎爱好者,如果你已经做了引擎等级的一些优化,请告知引擎开发者们!

3、c++语言等级

在这个等级,我的建议就是写一些无内存泄露的代码。使用cocos2dx引擎内存管理工具并且尽最大努力避免内存泄露。

三、建议和技巧

1、一帧帧的加载游戏资源。

2、减少绘制调用。使用CCSpriteBatchNode

3、按照最大到最小的顺序的加载纹理

4、避开内存使用高峰、

5、使用加载界面来预加载游戏资源。

6、当不需要的时候释放无用的资源

7、当有内存警告的时候释放缓存的资源

8、使用texturePacker来优化纹理尺寸,格式,色彩深度值等等。

9、小心使用JPG文件

10、使用16位RBGA4444色彩深度的纹理

11、使用NPOT纹理代替POT纹理

12、避开加载大尺寸图片

13、使用1024*1024 NPOT pvr.ccz纹理图集而不是原生图片

cocos2dx内存优化的更多相关文章

  1. 处理内存管理和iOS Cordova项目?

    任何人都可以告诉我如何处理基于iOSCordova的项目中的内存管理“收到内存警告”当我在iPhone或iPad上运行时,我在iOSCordova项目中收到此警告.我在我的应用程序中使用CDVlocation进行地理定位.我主要是在加载基于地图的视图时收到此消息.我正在使用基于ARC的Xcode项目任何帮助管理内存警告与cordova“收到内存警告”将不胜感激.谢谢你们解决方法在CDVPlugin.m中尝试这种方式

  2. xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建

    我的理论是,Swift的内存管理在优化的版本编译中出现了一些问题,只是在NSArray从Cocoa到达的特定情况下,在我们的代码可以获得它们之前,我们将它们桥接到[AnyObject].这样的NSArray没有正确地穿过桥.但是通过转换到NSArray然后回到特定的[SomeType]Swift数组,问题就解决了.当然,我认为当苹果公司指出这一点时,他们会解决这个问题,然后我们可以停止使用这种解决方法.但直到那时,我的应用程序再次在Release版本中运行.

  3. Xamarin.iOS在将C#编译为本机代码时对内存管理做了什么?

    什么Xamarin.iOS关于内存管理?使用通常的IL,我们有垃圾收集器,它处理未使用的对象和浮雕程序员调用删除.当Xamarin将代码编译为本机时,这是如何工作的?谁清理了不再使用的物体?这个问题回答了编译的工作原理,但没有解释内存管理部分:HowMonoTouchworks?

  4. swift语言的学习笔记六(ARC-自动引用计数,内存管理)

    Swift使用自动引用计数来管理应用程序的内存使用。当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。swift的ARC工作过程每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息。但是,如果ARC释放了正在被使用的实例,就不能再访问实例属性,或者调用实例的方法了。为了保证需要实例时实例是存在的,ARC对每个类实例,都追踪有多少属性、常量、变量指向这些实例。

  5. Swift内存管理概述

    Object-C的内存管理经历过2个阶段:手动引用计数内存管理MRC和自动引用计数内存引用管理ARC-MRC就是由程序员自己负责对象管理生命周期,负责对象的创建和销毁,ARC的程序员不用关心对象内存释放的问题,编译器在编译的时候在合适的代码位置插入内存释放代码。以C++和C为代表的手动内存管理模式,使用起来比较麻烦,经常导致内存泄露和内存过度释放等问题。

  6. Swift ARC-自动引用计数、内存管理

    当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。测试ARC输出结果从上面的例子来看,确实swift给我们自动管理了内存,很多时侯开发者都不需要考虑太多的内存管理。尽管ARC减少了很多内存管理工作,但ARC并不是绝对安全的。但是当无宿主引用所指实例被释放时,ARC并不能将引用值设置为nil,因为非可选类型不能设置为nil。

  7. 关东升的《Swift2.0》暂定名即将出版

    关东升的《Swift2.0》(暂定名)即将出版大家好:苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,《Swift2.0》(暂定名)Swift2.0》将在《Swift开发指南》第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者。我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下。

  8. 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

    Swift使用自动引用计数来管理应用程序的内存使用。当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。swift的ARC工作过程每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息。但是,如果ARC释放了正在被使用的实例,就不能再访问实例属性,或者调用实例的方法了。为了保证需要实例时实例是存在的,ARC对每个类实例,都追踪有多少属性、常量、变量指向这些实例。

  9. swift 内存管理

    Swift是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配。当我们通过初始化创建一个对象时,Swift会替我们管理和分配内存。添加weak后的输出:AdeinitBdeinit可能有心的朋友已经注意到,在Swift中除了weak以外,还有另一个冲着编译器叫喊着类似的“不要引用我”的标识符,那就是uNowned。可以将printName修改为这样:lazyvarprintName:()->()={[weakself]inifletstrongSelf=self{println(“Thename

  10. Swift内存管理ARC之循环引用

    此时这个Cat实例对象已经有三个强引用了。只有直到对象所有的引用被打破,ARC才会释放该对象当最后一个强引用被打破后,这个Cat对象被成功释放,输出:jack对象释放成功!解决循环引用办法Swift提供了两种方法来解决循环引用问题:弱引用无主引用声明变量或属性时,在前面加上”weak”关键词表示它是一个弱引用。从而达到打破循环引用的效果。这样便导致了循环引用。

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部