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

Echo-BOX Echo-BOX     2022-11-11     689

关键词:

一、内存优化原则

 

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

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

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

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

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

 技术分享图片

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

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

如下代码即可:

CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();

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

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)

这些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纹理图集而不是原生图片

llvm之ir篇:如何使用llvmir优化器

本文基于release/12.x版本的LLVM源码,介绍了LLVMIR优化的基本概念以及opt工具的使用方法。从而,初步了解LLVMIR优化器以便更深入地研究相关内容。阅读完整内容见微信公众号同名文章(技术专栏->LLVM编译器) 查看详情

10cocos2dx3.0游戏开发找小三之容器篇:vectormapvalue

重开发人员的劳动成果。转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613容器3.0版本号之前Cocos2d-x引擎为我们提供了CCArray、CCDictionary等Objective-C风格的容器;使用Cocos2d-x容器的一个重要原因在于Cocos2d-... 查看详情

java高级篇(jvm内存模型内存管理之第二篇)

本文转自https://zhuanlan.zhihu.com/p/25713880。 JVM的基础概念JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机。JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识... 查看详情

cocos2dx的内存优化

 1加载图片过程优化问题:以cocos2dx2.x为例,创建精灵CCSprite的过程中会创建一个CCImage,所以短时间会占用2倍内存,所以应避免连续加载(同一帧内,加载多张图片)。解决:一帧加载一个纹理(CCTextureCache的addImage方法),... 查看详情

android性能优化之string篇

Android性能优化之String篇关于String相关知识都是老掉牙的东西了,但我们经常可能在不经意的String字符串拼接的情况下浪费内存,影响性能,也常常会成为触发内存OOM的最后一步。所以本文对String字符串进行深度解析&#... 查看详情

vue.js前后端同构方案之准备篇——代码优化

...备篇,工欲善其事,必先利其器。我们先在代码层面进行优化,对我们完成整个技术架构是起到基础作用的。此准备篇是独立的,即使你们的项目不使用Vue.js,也不影响文章的阅读,是代码的基础优化。一、前言目前Vue.js的火爆... 查看详情

rk3568平台开发系列讲解(系统优化篇)如何进行内存优化

查看详情

游戏ai—行为树优化之

...一的行为树,本篇文章和下一篇文章我们将对行为树进行优化,在本篇文章中我们讲到的是内存优化问题上一篇中我们设计的行为树由于直接采用new进行动态内存分配,没有自己进行管理。因此行为树各节点的存储位置会散布在... 查看详情

android性能优化之内存泄漏检测以及内存优化(下)(代码片段)

...测以及相关案例,这篇我们继续来分析一下Android内存优化的相关内容。  上篇:Android性能优化之内存泄漏检测以及内存优化(上)。  中篇:Android性能优化之内存泄漏检测以及内存优化(中)。... 查看详情

android性能优化之string篇

Android性能优化之String篇关于String相关知识都是老掉牙的东西了,但我们经常可能在不经意的String字符串拼接的情况下浪费内存,影响性能,也常常会成为触发内存OOM的最后一步。所以本文对String字符串进行深度解析&#... 查看详情

c/s通信交互之http篇cocos2dx(client)使用curl与jetty(server)实现手机网游http通信框架(内含解决curl.h头文件找不到问题)

之前已经分享过一篇基于Cocos2dx与服务器使用Socket进行通信的框架,还不太熟悉的请移步到如下博文中:【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSDSocket与Mina(Server)手机网游通信框架!那么今天Himi来分享如何在cocos2dx中使用Http... 查看详情

android性能优化之内存泄漏检测以及内存优化(下)(代码片段)

...鞋加群544645972一起交流。Android内存优化上篇博客描述了如何检测和处理内存泄漏,这种问题从某种意义上讲是由于代码的错误导致的,但是也有一些是代码没有错误,但是我们可以通过很多方式去降低内存的占用ÿ... 查看详情

android性能优化之内存泄漏检测以及内存优化(中)(代码片段)

...ndroid中内存泄漏的检测以及相关案例,和Android的内存优化相关内容。  上篇:Android性能优化之内存泄漏检测以及内存优化(上)。  中篇:Android性能优化之内存泄漏检测以及内存优化( 查看详情

spark性能优化指南--高级篇

...调优调优概述数据倾斜发生时的现象数据倾斜发生的原理如何定位导致数据倾斜的代码查看导致数据倾斜的key的数据分布情况数据倾斜的解决方案解决方案一:使用HiveETL预处理数据解决方案二:过滤少数导致倾斜的key解决方案... 查看详情

mysql优化之索引优化

...索引优化索引优化涉及到几个方面,包括了索引的类型、如何让查询使用索引,查询是索引算法的选择等等操作。(原文链接http://ddbiz.com/?p=961)涉及到数据库的查询时,大多数情况都是要建立索引的,MySQL的索 查看详情

安卓面试之轻松战胜内存优化问题(代码片段)

熟悉如何内存优化,无疑是安卓工程师进阶的一个必要条件,同时也是面试的重点和难点。面试常见问题:1、如何优化内存;2、如何加载10M大小的图片;3、如何线上监控内存为什么要优化内存移动设备中ÿ... 查看详情

spark性能优化指南——高级篇

Spark性能优化指南——高级篇[TOC]前言继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。数据... 查看详情

chrome调试工具高级不完整使用指南(优化篇)

...一篇文章中说一说,其他一些chrome调试工具的使用方法2.2优化模块介绍2.2.1Network模块 在netWork模块中,大致上可以分成四块模块,1-这个模块相当于是一个功能菜单,左边的四个按钮依次表示的是:1-1停止捕获请求1-2清除所有... 查看详情