文档章节

内存管理(3):如何优化内存使用

piggybear
 piggybear
发布于 2015/02/16 10:33
字数 1255
阅读 5
收藏 0

1. 内存优化原理

为优化应用内存使用,开发人员首先应该知什么最耗应用内存,答案就是纹理! 纹理几乎会占据90%应用内存。所以尽量最小化应用的纹理内存使用,否则应用很有可能会因为低内存而崩溃。 本文介绍Cocos2d-x游戏通用的两条内存优化原理指导。


(1)认识瓶颈寻找方案

什么样的纹理最耗应用内存?或这些纹理会消耗多少内存?当然这个不用手动计算,只需猜测。 工具在这里已经准备好了。使用的是苹果的工具“Allocation & Leaks”。你可以在Xcode中长按“Run”命令,选择“ Profile ”来启动这两个工具。如下所示:


使用Allocation工具可以监控应用的内存使用,使用Leaks工具可以观察内存的泄漏情况。 此外还可用一些代码获取游戏内存使用的其他信息,如下所示:

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

调用这个代码后,游戏便会在DEBUG模式运行,这时你会在Xcode控制台窗口看到一些格式工整的日志信息。
1
2
3
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内存。


(2)切勿过度优化

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


2. 内存优化水平


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


(1)客户端等级

这是最重要的的优化等级。因为我们要在Cocos2d-x引擎顶层编译游戏,引擎自身会提供一些优化选项。 在这个等级我们可以进行大部分优化。简而言之,我们可以优化纹理、音频、字体及粒子的内存使用。

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


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


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


(2)引擎等级

需要OPENGLES及游戏引擎高手


(3)C++语言等级

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


3. 提示和技巧


(1)  一帧一帧载入游戏资源
(2)  减少绘制调用,使用“Use CCSpriteBatchNode”
(3)  载入纹理时按照从大到小的顺序
(4)  避免高峰内存使用
(5)  使用载入屏幕预载入游戏资源
(6)  需要时释放空闲资源
(7)  收到内存警告后释放缓存资源.
(8)  使用纹理打包器优化纹理大小、格式、颜色深度等
(9)  使用JPG格式要谨慎!
(10)  请使用RGB4444颜色深度16位纹理
(11)  请使用NPOT纹理,不要使用POT纹理
(12)  避免载入超大纹理
(13)  推荐1024*1024 NPOT pvr.ccz纹理集,而不要采用RAW PNG纹理

来源网址:http://cn.cocos2d-x.org/tutorial/show?id=221

本文转载自:http://blog.csdn.net/aa294194253/article/details/39455485

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
linux应用一Redis安装和配置

安装环境 • 操作系统:Centos6.4 x64 • 安装软件:redis-3.2.9.tar.gz 1. 环境优化 做如下优化原因:解决redis启动时报错。 修改somaxconn 该内核参数默认值一般是128(定义了系统中每一个...

十二楼中月
07/02
0
0
tomcat性能调优和性能监控(visualvm)

tomcat服务器优化 1、JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆...

纯洁的微笑
2016/11/07
417
1
安卓如何回收返回栈底部页面中的图片内存?

安卓应用为了能打开几十个有图片的页面,比如60个,使用默认的内存管理机制是不够的。经测试使用默认的内存管理机制打开10个左右的含图片的页面时app占用内存就达到了200多兆,这导致新开的页...

logan676
2017/07/12
44
0
如何用分布式缓存服务DCS实现Redis内存优化

Redis是一种支持Key-Value等多种数据结构的存储系统,其数据特性是“ALL IN MEMORY”,因此优化内存十分重要。在对Redis进行内存优化时,先要掌握Redis内存存储的特性比如字符串,压缩编码,...

中间件小哥
07/13
0
0
程序员必读:Linux内存管理剖析

现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的。 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在...

linuxprobe
2016/05/11
137
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
31
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部