Cocos2d-x:如何优化内存使用

一、 如何优化内存使用

内存优化原理

为优化应用内存使用,开发人员首先应该知道什么最耗应用内存,答案就是纹理!

纹理几乎会占据90%应用内存。所以尽量最小化应用的纹理内存使用,否则应用很有可能会因为低内存而崩溃。

本文介绍Cocos2d-x游戏通用的两条内存优化原理指导。

认识瓶颈寻找方案

什么样的纹理最耗应用内存?或这些纹理会消耗多少内存?当然这个不用手动计算,只需猜测。

工具在这里已经准备好了。使用的是苹果的工具“Allocation & Leaks”。你可以在Xcode中长按“Run”命令,选择“ Profile ”来启动这两个工具。如下所示:

Allocation & Leaks


使用Allocation工具可以监控应用的内存使用,使用Leaks工具可以观察内存的泄漏情况。

此外还可用一些代码获取游戏内存使用的其他信息,如下所示:
CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
调用这个代码后,游戏便会在DEBUG模式运行,这时你会在Xcode控制台窗口看到一些格式工整的日志信息。
Cocos2d: cocos2d: "cc_fps_images" rc=5 id=3 256 x 32 @ 16 bpp => 16 KB
Cocos2d: cocos2d: "XXX/hd/actor.pvr.ccz" rc=1059 id=4 2048 x 2048 @ 32 bpp => 16384 KB
Cocos2d: cocos2d: CCTextureCache dumpDebugInfo: 2 textures, for 16400 KB (16.02 MB)

从上可以看到会显示纹理的名称、引用计数、ID、大小及每像素的位数。最重要的是会显示内存的使用情况。

如“cc_fps_images”指消耗了16KB内存,而“actor.pvr.ccz”消耗了16M内存。

切勿过度优化

这是一个通用的优化规则。在优化过程中,应该做一些权衡取舍。因为有时候图像质量和图像内存使用是处于两级的状态。千万不要过度优化!

内存优化水平

在此将ccos2d-x内存优化分为三个等级。每个等级都有不同的说明,策略也有点不一样。

客户端等级

这是最重要的的优化等级。因为我们要在Cocos2d-x引擎顶层编译游戏,引擎自身会提供一些优化选项。

在这个等级我们可以进行大部分优化。简而言之,我们可以优化纹理、音频、字体及粒子的内存使用。

首先看纹理优化,为了优化纹理内存使用,必须知道什么因素对纹理内存使用的影响最大。主要有3个因素会影响纹理内存,即纹理格式(压缩还是非压缩)、颜色深度和大小。我们可以使用PVR格式纹理减少内存使用。推荐纹理格式为pvr.ccz。纹理使用的每种颜色位数越多,图像质量越好,但是越耗内存。所以我们可以使用颜色深度为RGB4444的纹理代替RGB8888,这样内存消耗会降低一半。此外超大的纹理也会导致内存相关问题。所以最好使用中等大小的纹理。

音频优化,3个因素会影响音频文件的内存使用,即音频文件数据格式、比特率及采样率。推荐使用MP3数据格式的音频文件,因为Android平台和iOS平台均支持MP3格式,此外MP3格式经过压缩和硬件加速。背景音乐文件大小应该低于800KB,最简单的方法就是减少背景音乐时间然后重复播放。音频文件采样率大约在96-128kbps为佳,比特率44kHz就够了。

字体和粒子优化,在此有两条小提示:使用BMFont字体显示游戏分数时,请尽可能使用最少数量的文字。例如只想要显示单位数的数字,你可以移除所有字母。至于粒子,可以通过减少粒子数来降低内存使用。

引擎等级

如果你不是一个OpenGLES及游戏引擎高手,可以略过这部分。因为Cocos2d-x是一个开源游戏引擎,如果你在引擎等级中做了什么优化,请告知我们!

欢迎任何改进和代码。

C++语言等级

在这个等级中,建议是编写无内存泄露代码。遵循Cocos2d-x内置的内存管理原则,尽量避免内存泄露。

提示和技巧
一帧一帧载入游戏资源
减少绘制调用,使用“Use CCSpriteBatchNode”
载入纹理时按照从大到小的顺序
避免高峰内存使用
使用载入屏幕预载入游戏资源
需要时释放空闲资源
收到内存警告后释放缓存资源.
使用纹理打包器优化纹理大小、格式、颜色深度等
使用JPG格式要谨慎!
请使用RGB4444颜色深度16位纹理
请使用NPOT纹理,不要使用POT纹理
避免载入超大纹理

推荐1024*1024 NPOT pvr.ccz纹理集,而不要采用RAW PNG纹理

用户喜欢...

电源管理集成电路(PMIC)如何减少这些挑战的影响

在设计具有现场可编程门阵列(FPGA)的系统时,系统设计人员可以获得三个好处:可重编程性,性能可扩展性和快速上市时间。但是,设计师也必须克服挑战。在这篇文章中,我将讨论电源管...


为了提高效率 - 如何将双向功率流集成到UPS设计中(第2部分)

在本系列的第1部分中,我讨论了如何将双向功率流集成到不间断电源(UPS)设计中。在第二部分中,我将更详细地介绍用于UPS和电池备份应用的2kW,48V至400V, 93%效率,隔离双向DC / DC转换器参...


为了提高效率 - 如何将双向功率流集成到UPS设计中(第1部分)

随着对更紧凑,更小和更高效的电力系统的日益重视,对双向转换器的兴趣日益增加。能够双向功率流的双向DC / DC转换器可以将传统上用于电池充电和备份操作所需的两个DC / DC转换器组合成一...


如何为高性能、低侧电流传感设计电路板?

在我以前的 博客帖子 我讨论了低侧电流传感如何帮助控制电机,然后给出了设计低侧电流传感电路的三个步骤,以适用于成本敏感的应用。在这篇文章中,我将讨论如何使用正确的印刷电路板...


如何设计-130-dB超低失真数据采集系统

数据采集​​系统(DAS)是工业,医疗和电信应用的标准测量和分析仪器,包括医学成像,音频和振动分析以及模拟和数字调制系统的测试。在大多数情况下,采集和数字化信号通过快速傅里叶...


自主汽车传感器:处理器算法如何获得输入

尽管鉴于最近特斯拉级别S的死亡,有关自主汽车消亡的非技术性媒体报道,我想在本文中介绍传感器电子设备,结合更好和更精细的软件算法,最终将实现在未来十年内,一辆安全,完全自主...


如何设计电感式触摸金属按钮面板

人机界面(HMI)正在经历地震变化,现在有一种新方法可用于设计按钮面板。在创建金属触摸(ToM)按钮时,电感式传感技术正成为首选方法。主要原因是它可以降低成本,同时更加可靠,因为...


Maxim 的 MAX-HEALTH-BAND 开发平台优化了设计周期,用于开发高精度小型高功效可穿戴健康和健身应用

Maxim的 MAX-HEALTH-BAND 是一个开发和评估平台,包括心率和活动监视器,使设计人员能够为他们的可穿戴设计提取生命体征和原始数据。该平台基于小型高能效 IC,包括经过优化的 MAX86140 光学脉搏...


如何为RF应用选择,使用和维护同轴连接器

无线电频率(RF)电路在有线和无线通信中正在激增,包括用于物联网(IoT)的Wi-Fi和各种无线技术。这些高频信号需要在系统,电路组件和子组件之间进行分配,而损耗或寄生辐射损耗最小。...


如何快速实施符合Qi标准的无线充电系统

对于移动设备,充电过程仍然是最后的束缚。尽管诸如无线充电联盟(WPC)Qi规范等标准有助于支持更高的充电功率水平,但开发人员在设计电路,印刷电路板和固件时仍面临多重挑战,以全面...


如何快速将NFC功能添加到任何应用程序

为了满足对近场通信(NFC)能力日益增长的需求,开发人员被要求快速创建优化设计。传统方法的发展速度缓慢,因为设计人员面临诸如RF电路优化,NFC协议管理,功耗以及最小设计占用等挑战...


降低机器人风险:如何设计安全的工业环境

工业自动化(IA)的增加,特别是工业机器人的使用,正在增加人类操作员与其他移动设备或移动机器之间的意外交互的机会。设计师有责任采取适当且经常重叠的安全预防措施,以避免从生产...


如何设计可靠,准确的存在感应

随着消费和工业系统变得更智能,更具交互性和更自主,他们需要能够感知对象,用户或路过者的存在。尽管基本的在场感知技术和技术已经很成熟,但设计人员面临着更精确,高效,经济高效...


无论环境如何,都可获得高精度,多通道温度测量

尽管温度测量是许多应用的常见要求,但开发人员在确保高度准确的结果方面面临严峻的挑战。克服这些挑战通常会导致设计复杂和设计周期延长,但新设备正在降低复杂性。 本文简要讨论与...


智能制造商如何将工业4.0原则提高到质量

质量很重要。许多制造商会告诉你,质量差,影响到最高和最低。他们会告诉你,质量差的后果正在崛起,社交媒体可能会使质量问题对OEM品牌造成破坏。他们也会告诉你,他们正在努力应对。...


数字双胞胎如何在物联网支持的环境中推动创新

动态数字表示或数字双胞胎正在迅速改变行业设计,构建和操作其产品和流程的方式。Gartner预测,到2021年,一半的大型工业公司将使用数字双子机,从而使这些机构的有效性得到10%的提高。...