注:原文地址不详!

1、2d游戏最占内存的无疑是图片资源。

2、cocos2d-x不同平台读取纹理的机制不同。

ios以下使用CGImage,android和windows下是直接调用png库。我測试了下。使用png库直接读取png会比CGImage还要节约1mb左右内存(图片所占内存4mb)可是速度要比CGImage慢一倍。

时间和空间怎样取舍就看实际情况了。只是最佳的选择似乎是pvr(即使android版本号。即使不使用pvrtc4)。

3、一般来说,我们能够直接使用  w * h * bpp得到一张纹理所占的内存,比方一张1024*1024格式为argb8888,那么他所占的内存就是1024*1024*4=4mb。

之前看到有博客提到jpg会开辟3倍与此的内存(先转换为png,然后解析png)。可是新的ios系统似乎没有这个问题。jpg与png所消耗的内存差点儿同样,而且jpg解析速度更快(差点儿都是4mb解析+4mb纹理数据,而jpg解析时间是png的一半)。可是这样反而非常怪异,由于jpg是没有透明色的,一个像素最多3字节,而png一个像素4字节,jpg纹理应该占用内存更小才对。后来看了下cocos2d的ios载入图片的代码,它把全部纹理转换成rgba8888格式。所以不管是jpg还是png,占用的都是4字节。正因cocos2d对其它纹理支持不够好,pvr才会显得那么高效。

4、pvr格式能够被显卡所认可。而不须要开辟暂时内存来读取,所以即便同为argb8888格式的图片,pvr也会比png有效率。尽管不会节约程序稳定执行时的内存,可是会避免载入大量图片时的内存暴涨。  而且假设是ios设备的话,能够使用pvrtc4格式的图片,这个格式相当于windows下的dds图片,是能够被显卡直接支持的。它是有损压缩,一个像素仅仅占4位,只是假设不是有渐变半透明色的话,一般效果能够接受。而其节约的内存和cpu时间很很显著。

5、pvr也不是万金油。

android设备下尽管能够使用pvr格式。可是不能使用pvrtc4,希望通过pvr像ios设备上一样真正降低游戏内存是不太可行的。

6、pvr.ccz事实上就是pvr图片zip打包下,程序读的时候还是先解压出pvr资源。然后再读取pvr。

只是因为压缩下能够极大的减小图片体积。所以尽管多了解压过程也不会有特别多的cpu消耗。

7、一张jpg图片实际载入过程内存消耗,以一张1024*1024 argb8888 500k的jpg图片为例: a.读取图片文件(消耗图片大小内存,500k)     b、解析jpg数据(cgimage, 4mb) c、释放500k的图片内存    d、opengl纹理数据(4mb)
   e、释放cgimage的4mb内存。      注意。这个过程不是必定的顺序运行,释放cgimage内存的实际是有系统决定的,会非常快,可是不一定是马上运行。  所以内存会瞬间飙升9mb左右,然后降低5mb。稳定到4mb左右

png图片的载入过程与此同样

pvr图片能够节约解析图片数据到纹理这一步的消耗。也就是说读取pvr图片资源(等价于解压pvr.ccz到内存,假设是1024*1024 argb8888格式的话。那么图片大小就是4mb,ccz压缩后图片1mb左右)消耗4mb,将pvr图片数据提交给显卡消耗4mb。然后释放文件数据4mb。这么看似乎跟Png从内存占用上相比也不是很有优势。(注意这里说的pvr是指pvr封装的argb8888,与pvrtc4的性能有天差地别)

8、因为终于消耗内存的都是纹理数据。所以仅仅要纹理数据格式是一定的,不管图片是什么格式消耗的内存都是一样的。比方使用Png8图片,体积会降低70%。可是内存占用与png24/png32是等价的(读取的时候会内部把调色板还原成真彩色。也就是说,尽管png8是一个像素仅仅占8位。可是读取到内存中的时候会将调色板颜色还原。依旧须要开辟1024*1024*4字节的空间存放纹理数据)。
当然有无透明色,cocos2d的处理还是有差别的。

假设是无透明色。能够使用png24,那么所需开辟的纹理空间就是3mb。

这里另一点须要说明,一般我们处理windows下的dds纹理的时候,都习惯将其按2的整次幂对其,尽管图片内容仅仅有900*900。可是图片大小却是1024*1024。那我们读取这个图片所消耗的内存就是4mb。按2的整次幂对其是有助于提高执行效率的。可是不是很必须的。ios和android的设备都支持非2的整次幂的纹理。所以假设是png图片,那么它该多大就多大。此时消耗的内存就仅仅有900*900*4=3mb。

9、不要过于迷信所谓的去除alpha通道以节约内存。这个还要实际分析下详细结果。  我測试过(分别用cocos2d-x和鬼火3d引擎),rgba8888和rgb888格式的png图片显示所消耗的内存是一样的。

24位图片尽管读取的时候开辟的内存仅仅有3mb(1024*1024*3,注意假设是用CGImage读取的话,那这个值就是4mb),可是glTexImage2D提交给显卡后依旧会添加4mb内存。

可能跟显卡的数据对齐有关。

这里我測试另一个诡异的地方。假设是用pvr的npot图片的话,rgb888要比rgba8888所消耗的内存要小,可是pot图片两者又是一样的(png图片两种情况都是一样的)。可能是powervr显卡有特殊处理。

10、rgb565和rgb5551的图片所消耗的内存是rgba8888的一半,假设没有透明渐变的话。视觉上也看不出什么差别。一些大的背景图能够优先选择这样的格式。

11、pvr图片载入速度要比png和jpg快3~5倍(相同1024*1024 argb8888)。png消耗的时间可能是700ms左右,可是pvr仅仅须要100ms左右。假设是pvr.ccz压缩下。消耗的时间是200ms左右。可见pvr在载入速度上还是有很大的优势的。这个应该是由于png和jpg须要把图片数据还原为rgba。可是pvr能够直接把图片数据传递给显卡。pvrtc4的图片是能够被powervr显卡直接支持的。

总结下:

1、终于决定图片占用内存的是它的像素格式和大小,与其扩展名无关。

png8  png32 jpg pvr仅仅要其像素格式都是argb8888,那么终于图片占用的内存是一样的。

2、假设不是pvrtc4的格式。那么不要扩展成2的整次幂。由于图片越小,占用内存越小

3、单单去除透明通道不会降低图片所消耗的内存,png和jpg图片也无法降低图片体积,所以不推荐rgb888的格式。

替代选择rgb565和rgb5551。

5、小心载入图片时暂时开辟的纹理数据造成的内存飙高,能够考虑增加内存池。及时的开辟和释放缓冲区。

6、假设是为了降低图片体积能够选择:1、jpg--压缩比最高,质量较好。可是不支持半透明    2、png8--相同图片会比jpg略大一些,使用ImageAlpha进行转换。视觉上差点儿看不出区别。

这两种图片格式都能够极大的降低图片体积(降低70%~80%)。可是无助于降低内存

7、假设是为了降低内存能够选择:1、没有透明色的图片统一转换为rgb565格式。这个时候无法使用png8了,所以png和pvr.ccz图片大小差点儿同样,pvr.ccz速度更快,所以推荐pvr.ccz的rgb565格式    2、假设透明色不过进行关键色标注,而没有渐变混合。那么推荐rgb5551
(r5_a1)的pvr.ccz格式

8、能够考虑写个打包系统,统一把资源文件打包,而不是单个文件用pvr.ccz进行zip压缩。这样能够获得更高的效率。(比方我封装了下暴雪的mpq打包,其读取速度与本地文件读取速度相当。这样就能够获得最佳的读取效率)

最后附上我測试的数据日志。图片是一张1024*1024的图片。实际图片内容大小为960*700。測试设备iphone4,png jpg等图片载入代码改动为windows版本号。tex后面是图片的载入时刻。

over表面后括号被装入内存占用。

版权声明:本文博主原创文章。博客,未经同意不得转载。

OS和android游戏纹理优化和内存优化(cocos2d-x)的更多相关文章

  1. 转 iOS和android游戏纹理优化和内存优化(cocos2d-x)

    iOS和android游戏纹理优化和内存优化(cocos2d-x) (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用CGImage, ...

  2. Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法,需要的朋友可以参考一下     1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...

  3. 微擎开启性能优化里面的性能优化memcache内存优化及数据库读写分离

    http://www.mitusky.com/forum.php?mod=viewthread&tid=3135 [微擎 安装使用] 微擎开启性能优化里面的性能优化memcache内存优化及数 ...

  4. iOS和android游戏纹理优化和内存优化(cocos2d-x)(转载)

    转自http://blog.csdn.net/langresser_king/article/details/8426708 (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x ...

  5. iOS和android游戏纹理优化和内存优化(cocos2d-x)

    1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用 CGImage,android和windows下是直接调用png库.我测试了下,使用png库直 ...

  6. Android优化之内存优化倒计时篇

    本文来自网易云社区 作者:聂雷震 本篇文章介绍的内容是如何在安卓手机上实现高效的倒计时效果,这个高效有两个标准:1.刷新频率足够高,让用户觉得这个倒计时的确是倒计时,而不是幻灯片:2.不能占用太多的内 ...

  7. 【转】Android开发之Bitmap的内存优化详解

    本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...

  8. KVM总结-KVM性能优化之内存优化

    我们说完CPU方面的优化(http://blog.csdn.net/dylloveyou/article/details/71169463),接着继续第二块内容,也就是内存方面的优化.内存方面有以下四 ...

  9. Linux性能优化之内存优化(二)

    前言 不知道大家看完前面一章关于CPU优化,是否受到相应的启发呢?如果遇到任何问题,可以留言和一起探讨这方面的问题.接下来我们介绍一些关于内存方面的知识.内存管理软件包括虚拟内存系统.地址转换.交换. ...

随机推荐

  1. addChildViewController transitionFromViewController nib storyboard

    本文记录addChildViewController由transitionFromViewController方法nib,storyboard的不同的效果. 在进行切换效果时,注意属于同一个story ...

  2. 白板编程浅谈——Why, What, How(转)

    原文链接:http://lucida.me/blog/whiteboard-coding-demystified/ 这篇文章节选自我正在撰写的一本关于应届生面试求职的书籍,欢迎在评论或微博(@peng ...

  3. 图表引擎AChartEngine 二

    这几天项目涉及到android图表绘制,网上找的Demo都是大同小异,也就如上篇博文所写的一样是基本函数的实现.可是所有能找到的Demo都和设计图不符.木有办法,Leader发话啦,万不得已的情况下不 ...

  4. Spark里面:获取图Spark有多少行代码

    Spark1.0.0公布一个多月,有多少行代码就(Line of Code, LOC)? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW56aHNvZn ...

  5. 【C语言探索之旅】 第二部分第四课:字符串

    内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  6. Microsoft Toolkit 2.5下载 – 一键激活Windows 8.1/2012 R2/Office 2013

    http://www.dayanzai.me/microsoft-toolkit-2-5.html

  7. 开源Math.NET基础数学类库使用(08)C#进行数值积分

    原文:[原创]开源Math.NET基础数学类库使用(08)C#进行数值积分               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  8. 如何从Terminal Command Line编译并运行Scope

    Ubuntu SDK我们大部分的开发者是非常有效的.它甚至可以帮助我们进行在线调试.在这篇文章中,我们介绍了如何使用command line编译和执行我们scope. 1)创建一个主Scope 我们能 ...

  9. Install Orace 11g on Solaris 10 Sparc 64 bit

    昨天有一个客户端安装11g数据库.整个安装过程和一些遇到的问题是一个创纪录.共享. 由于客户不能使用自己的机器远程连接到server,意通过U盘.移动硬盘等拷贝不论什么文件.因此一些记录内容无法做到非 ...

  10. 二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))

    问题: 找到两个节点的二叉树的最近的共同祖先. 首先可以参考这个博客http://blog.csdn.net/cxllyg/article/details/7635992 ,写的比較具体,包含了节点包 ...