2014年05月24日更新
以前的关注点都是 怎么用 根本没有往深层次追踪过。为什么这么用。今天记录下:
如果我们用的是pvr.ccz的图片 加载到内存中是根据你到处是的像素格式来渲染到ui中。如到处是你用16位则加载到内存中他还是16位。占用的内存比较少。
如果你用32位 则内存中也是32位 内存是16位的2倍;
但是如果你用的是png jpg则不是上面的方式 。。不管你用什么格式 加载到内存中都是32位占的内存是最大的。除非你设置
Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA4444);
用完之后记得设置为默认模式
Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::DEFAULT);
IOS与图片内存
在IOS上,图片会被自动缩放到2的N次方大小。比如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的。图片占用内存大小的计算的公式是;长*宽*4。这样一张512*512 占用的内存就是 512*512*4 = 1M。其他尺寸以此类推。(ps:IOS上支持的最大尺寸为2048*2048 ios 8 看了下 支持4096*4096)。
今天就说一下反馈的评论 有人说 图和标题怎么不一样 我解释下 最近我在弄点击图片放大图片的功能 所以为了测试我就随便加个图。测试用。。。
接着上次写的 。。。
在写之前 我想了一下 我要写的内容 和网上的内容一样。还有必要写吗,仔细想想 还是写比较好。。写下来 也算是自己了解过一次。虽然一样,但是记录下来闲暇的时候可以回顾一下。
言归正传 。我现在在开发一款手机游戏 梦幻寻仙,已经封测了两次了 。。都会出现各种问题。玩家反馈最多的就是 玩着玩着就崩了,这款游戏的内存在游戏页面也就是主页面 最大的时候竟然达到了400M的内存。。这是很高的内存了。。。玩不过一小时 必崩。。这种情况在项目开发之初就存在很大的问题。。所有的动画都是帧动画。。如玩家 橘色 坐骑 npc 怪 可以用骨骼动画,还有特效 也是帧动画,这个没办法 有些特效是可以用粒子特效。但是也有很多事没办法用粒子特效的。再就是背景音乐 大小是1.5M。太大了 比特率 和样本率都很高 只用音乐大师才能听得出差别来 对于我们这种屌丝玩家 无关紧要。。重要的是游戏别动不动就死。。。这是关键。
音乐 一般有三个因素影响文件内存使用。是音频文件格式,比特率,和样本率。
我们最希望音频文件时mp3格式。因为它被android和ios都支持。
并且它也被压缩并且硬件加速了。你应该保证你的背景音乐文件大小在800KB一下。
最简单的方式就是减少背景音乐播放时间并且重复调用。你应该保持你的音频文件样本率在96-128kbps之间,并且比特率在44kHz就足够了。
粒子系统 我们可以减少粒子数量 来减少内存。
让我们看一下纹理优化
为了优化纹理内存的使用,我们必须知道什么因素影响了内存的使用情况。
有三个因素影响了纹理的内存使用。纹理格式(压缩的还是非压缩的),颜色,大小。
我们可以使用PVR格式的纹理来减少内存使用。最被建议的纹理格式是pvr.ccz,每色的bit值越高,画面质量就约好。但是也会消费很多内存。
那么我们使用颜色深度是RGBA4444的纹理来代替RBGA8888,这将会消费一半内存。
我们也会发现大纹理也会导致内存相关的问题。那么你最好使用适度的大小。
程序包的【体积】优化方法:
首先 你需要很清楚当前自己项目什么地方占的体积最多,例如动画序列多少MB、地图占多少MB等等,都要提前做一个Check! 别总是认为哪里哪里可能占的多,要详细的知道才行!
1. 采用工具对资源进行[打包],例如TexturePacker 等工具。
2. 采用png压缩工具等,在打包图片前对每张图片进行[压缩]!
如果以上两点都做了还是体积过大,那么继续采取如下办法:
3. [降低图片质量],比如你项目使用的图片是24bit,那么你可以采用低一些的,例如8bit的图片质量类似。 (ps.别说这样会让图片失真,先试试降低到什么程度的bit最合适再说)
4. 使用特定的压缩格式的图片,例如[wdp] 等等
5. 如果项目中帧序列动画占的比较多,那么可以采取[降帧]的方式来优化。
6. [缩放] 图片!举例,假设你项目用了10张500*500规格的图片,那么你可以让美术把这种图片缩放70%~80%,然后用这种缩放过的图片进行程序放大。(这种方式的图片质量是否会看起来失真,完全取决于缩小的倍数决定,可以适当调整缩放倍数,但是此方法绝对可行!)
7.如果以上方式都优化过,那么可以采取 [换思路]方式,假设你的地图是一张500*500的大图作为背景地图,那么你要考虑是否可以采用地图编辑器来进行拼接的方式来进行!
8. 采用[编辑器],可以利用地图编辑器、动作编辑器、骨骼编辑器等从而减少资源的使用从而达到减少体积,降低内存的使用。
9. 如果以上方式还都无法让你的项目包体积降低,那么你只能采用[在线更新下载]了,将程序包分为两部分,一部分是启动游戏所需的必要资源,另外一部分是游戏启动非涉及到的资源,将启动不会使用的资源放在服务器端,通过在线更新方式,从服务器将其他资源下载到客户端即可。
10. 再如果以上方式都采用后还是体积偏大,宝贝,你只能来个[阉割版]了,常命名为[xxx Lite]
程序【运行内存】的体积优化方法:
其实降低程序包体积的方法很多都同时降低了程序的运行内存,例如:
1. [降低图片质量]、[调整图片规格]、 [采用编辑器]、[缩放图片] 等等。
其他方法:
2. [检查代码逻辑 ,主要看资源加载相关的部分代码]
3.[ 检查释放逻辑代码]
总之手机游戏的内存优化问题还是有很多需要改进的。。。