cocos2d-x内存优化原则
cocos2d吧
全部回复
仅看楼主
level 7
liuxijob 楼主
内存优化原则
为了充分利用你应用的内存,你应当了解什么东西最消耗内存,答案是纹理。 纹理占用了差不多90%的内存,所以我们应该尽我们所能的去缩小纹理所占用的内存大小,否则你的应用有可能会在系统出现内存过低警告的时候被系统关闭。 这边我给你两个关于cocos2d-x有的内存优化的基本原则。
了解瓶颈,并且弄明白它 什么样类型的纹理消耗了你应用的大多数内存,这些纹理花费了多少内存?你不需要靠指针去计算或者猜测去。 这边有几样的工具可以来帮助你。Apple的工具 Allocations & Leaks 你可以长按Xcode的Run命令选择Profile去运行这两个工具。 你可以使用Allocations这个工具去监视你的内存使用情况和内存泄露。 你同样也可以通过使用一些代码去获取游戏内存的有用信息。 代码如下: CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo(); 当你使用Debug模式运行你的游戏,你将会在xcode控制窗口看到一些格式化的信息。 就如以下格式 1Cocos2d: cocos2d: "cc_fps_images" rc=5 id=3 256 x 32 @ 16 bpp => 16 KB 2Cocos2d: cocos2d: "XXX/hd/actor.pvr.ccz" rc=1059 id=4 2048 x 2048 @ 32 bpp => 16384 KB 3Cocos2d: cocos2d: CCTextureCache dumpDebugInfo: 2 textures, for 16400 KB (16.02 MB) 如你所见,这些信息提供了纹理的名字,引用的次数,id,大小和色深(bit per pixel)(Bits Per Pixel = 16最大可以显示2^16色) 和最重要的内存使用情况。这里cc_fps_images消耗了16kb,actor.pvr.ccz consumes消耗16M的内存。 永远不要过度优化 这是一个基本的优化原则,当时优化内存的时候,你应当做一些权衡。因为一些图片的品质和图片所占用的内存是两个对立面。 内存优化等级 在这里我们把内存优化分为四个等级,在每一个等级里,我们都有不同的观点同时策略也会有一点改变。
首先,我们来优化纹理
为了优化纹理所使用的内存,我们必须知道主要影响纹理使用内存的因素是什么。
有3个影响纹理使用内存的因素。他们是纹理的格式(压缩和没有压缩),色深,和大小。
我们可以使用pvr格式的纹理来减少内存的使用。推荐使用的pvr.ccz的纹理格式.
多一些的颜色的纹理,图片会获得更好的质量。但是会消耗更多的内存。
我们可以使用色深RBGA4444来代替RBGA8888,这样我们就能解约一半的内存。
我们发现很大纹理同样也是影响内存的因素,你最好使用中等大小的纹理。
第二 我们从音频入手
音频文件同样有3个影响内存使用的因素,他们是音频文件的格式,比特率和采样率。
我们喜欢用mp3的音频格式文件。应为他们同时支持android和ios平台,他们都被压缩过并且能够使用硬件加速。
你应当让你的背景音乐文件大小低于800k。最简单的办法是减少背景音乐时间,用程序让他们循环播放。
你让你的音频文件采样率保持在96-128kbps,特比率在44kHz就足以了。 第三我们讨论下字体和粒子的优化。
我们给你两点小的建议,当你要显示游戏分数的时候用BMFont,选择最少字符的图片文件,例如
如果你仅仅想要显示纯数字,你可以去除掉其他的字母。
关于粒子,我们可以通过减少粒子的数目来减少内存的使用。
最后我们讨论下c++ 语言层等级
在这个等级里,我建议编写防止内存泄露释的代码,使用coco2d-x引擎的内存管理规则去创建,并且尝试尽你最大的努力去避免内存泄露。
提示和技巧
1.逐帧加载游戏资源。
2.减少绘制调用:使用CCSpriteBatchNode
3.读取纹理从最大到最小
4.避免高度内存泄露
5.使用加载界面预加载游戏资源
6.当资源不需要时请释放
7.当接受到内存警告应当释放缓存的资源
8.使用纹理包装去优化纹理的大小,格式,色深,和类似的东西.
9.小心使用JPGs!
10.使用RBGA4444色深的16-bit纹理
11.使用NPOT纹理去代替POT纹理
12.避免加载非常大的纹理
13.建议使用1024*1024 NPOT pvr.ccz的纹理集而不是未处理的png的图.
2014年08月26日 03点08分 1
1