优化内存使用
内存优化水平
本文将 Cocos2d-x 内存优化划分为三个等级,每个等级都有不同的特点和优化策略。
客户端等级
这是最为重要的优化等级。由于我们是在 Cocos2d-x 引擎顶层编译游戏,引擎自身会提供一些优化选项,在这个等级可以进行大部分的内存优化工作。具体可对纹理、音频、字体及粒子的内存使用进行优化。
纹理优化
要优化纹理内存使用,需了解影响纹理内存使用的关键因素。主要有三个因素会对纹理内存产生影响,分别是纹理格式(压缩或非压缩)、颜色深度和大小。
- 纹理格式:可以使用 PVR 格式纹理来减少内存使用,推荐的纹理格式为 pvr.ccz。
- 颜色深度:纹理使用的每种颜色位数越多,图像质量越好,但内存消耗也越大。因此,可以使用颜色深度为 RGB4444 的纹理代替 RGB8888,这样能使内存消耗降低一半。
- 纹理大小:超大的纹理容易引发内存相关问题,所以建议使用中等大小的纹理。
音频优化
影响音频文件内存使用的因素主要有三个,即音频文件数据格式、比特率及采样率。
- 数据格式:推荐使用 MP3 数据格式的音频文件,因为 Android 平台和 iOS 平台均支持该格式,且 MP3 格式经过压缩并支持硬件加速。
- 文件大小:背景音乐文件大小应低于 800KB,最简单的实现方法是减少背景音乐时长并进行重复播放。
- 采样率和比特率:音频文件采样率大约在 96 - 128kbps 较为合适,比特率 44kHz 即可。
字体和粒子优化
有两条实用的优化提示:
- 字体优化:使用 BMFont 字体显示游戏分数时,尽量使用最少数量的文字。例如,若只需显示单位数的数字,可移除所有字母。
- 粒子优化:可以通过减少粒子数量来降低内存使用。
引擎等级
如果您并非 OpenGL ES 及游戏引擎方面的高手,可跳过这部分内容。Cocos2d-x 是一个开源游戏引擎,若您在引擎等级进行了相关优化,欢迎与我们分享您的改进和代码。
C++ 语言等级
在这个等级,建议编写无内存泄露的代码。遵循 Cocos2d-x 内置的内存管理原则,尽可能避免内存泄露情况的发生。
提示和技巧
- 逐帧载入游戏资源:一帧一帧地载入游戏资源,避免一次性载入过多资源导致内存峰值过高。
- 减少绘制调用:使用“CCSpriteBatchNode”来减少绘制调用,提高渲染效率,降低内存开销。
- 按大小顺序载入纹理:载入纹理时按照从大到小的顺序进行,有助于合理分配内存。
- 避免高峰内存使用:合理规划资源的载入和释放,避免出现内存使用的高峰情况。
- 使用载入屏幕预载入资源:利用载入屏幕预载入游戏资源,让玩家在等待过程中完成资源的加载,提高游戏的流畅度。
- 释放空闲资源:在需要时及时释放空闲资源,保持内存的有效利用。
- 响应内存警告:收到内存警告后,及时释放缓存资源,避免因内存不足导致游戏崩溃。
- 使用纹理打包器:使用纹理打包器对纹理的大小、格式、颜色深度等进行优化,减少纹理占用的内存空间。
- 谨慎使用 JPG 格式:使用 JPG 格式时要谨慎,因为 JPG 格式在某些情况下可能会导致内存使用不合理。
- 选择合适的颜色深度:请使用 RGB4444 颜色深度 16 位纹理,在保证一定图像质量的前提下降低内存消耗。
- 使用 NPOT 纹理:请使用 NPOT 纹理,避免使用 POT 纹理,以优化内存使用。
- 避免载入超大纹理:尽量避免载入超大纹理,防止因纹理过大导致内存问题。
- 推荐纹理集:推荐使用 1024 * 1024 NPOT pvr.ccz 纹理集,而不要采用 RAW PNG 纹理,以减少内存占用。