图片格式及内存占用

2024-06-09 09:32
文章标签 内存 占用 图片格式

本文主要是介绍图片格式及内存占用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

游戏中最占内存的是图片,所以本篇主要讲图片的优化方式。


1、内存计算公式


        默认情况下,在cocos2d里面加载一张图片的时候,图片中每一个像素点使用4个byte(8位)来表示--分别代表red、green、blue和alpha透明通道。这个就简称RGBA8888(32-bit图)。因此使用默认的像素格式加载图片的话,内存消耗可以使用下面的公式计算:

        图片宽度 * 图片高度 * 每个像素点的位数 = 内存大小

        如:一张1024*1024的RGBA8888的图片占用的内存大小为 1024*1024*4 = 4M


2、通过修改像素格式优化内存大小和加载速度


        (1)RGBA8888(32-bit)

                RGBA 4个通道各占8位,如果想获得最好的图片质量,使用这种格式最靠谱,但他占用的内存会比16位的纹理多一倍,加载速度相对较慢。

        (2)RGBA4444(16-bit)

                RGBA 4个通道各占4位,他对每个通道都有不错的支持,还能保证相对良好的图片质量,以及加载速度和内存占用。

        (3)RGB5A1   (16-bit)

                RGB 3个通道各占5位,A通道仅占一位,RGB通道表现良好,A通道只有透明和不透明两种,加载速度和内存占用表现良好。

        (4)RGB565   (16-bit)

                RGB 3个通道分别占5、6、5位,没有A通道,在16为纹理中,图片质量最好。


3、TexturePacker


       使用图片打包工具(如:TexturePacker)把散图打包成一张大图,一方面可以节省内存,另一方面还可以提高加载速度。

        (1)抖动

               TP有一个特性叫“抖动”,他可以使得原本由于颜色数量减少(如:RGBA4444格式)而产生的失真问题得到改善。

        (2)NPOT

                NPOT是“non power of two”的缩写,即“不是2的幂”。cocos2d 2.x默认支持。如果纹理集使用NPOT的纹理,他允许TP更好的压缩纹理,因此会更少的浪费纹理图集的空白区域。

                NOPT是“non power of two”的缩写,译作“不是2的幂”。NPOT stands for “non power of two”. 在cocos2d1.x的时候,你必须在ccConfig.h文件中开启对NPOT的支持,但是,cocos2d 2.x就不需要了,它默认是支持NPOT的。所有3代(iphone 3GS)以后的ios设置都支持cocos2d 2.x(因为它们支持OpenGL ES2.0),所以也都能支持NPOT纹理。

如果纹理图集(texture atlas)使用NPOT的纹理,它将有一个具大的优势:它允许TP更好地压缩纹理。因此,我们会更少地浪费纹理图集的空白区域。而且,这样的纹理在加载的时候,会少使用1%到49%左右的内存。而且你可以使用TP强制生成NPOT的纹理。(你只需要勾选“allow free size”即可)

为什么要关心NPOT呢?因为苹果的OpenGL驱动有一个bug,导致如果使用POT的纹理,则会产生额外33%的内存消耗。


4、png、jpg、pvr


        (1)pvr

                pvr图像是专门为ios设备上面的powerVR图形芯片指定的图形容器,可以直接加载到显卡上,而不需经过中间的转化。

        (2)png

                cocos加载png图片分两个阶段:①从图片文件中临时创建一个UIImage对象。②以这个创建好的UIImage对象来创建CCTexture2D对象。这意味着当一个纹理被加载的时候,在短时间内,他的内存占用会是自身内存的2倍。(由于cocos自动释放,临时创建的UIImage对象会被回收。)

        (3)jpg

                cocos加载jpg图片的时候会实时的转换为png格式的纹理,这意味着短时间内,他的内存占用会是自身的3倍,而且加载速度非常慢。


5、pvr.ccz


        pvr.ccz其实就是pvr图片的zip压缩包,程序读的时候会先解压出pvr资源,然后再读取pvr。不过由于压缩可以极大的减少图片体积,而且虽然多了解压过程也不会有特别多的cpu消耗,所以程序如果使用pvr图片的话大部分采用pvr.ccz格式。


6、PVRTC压缩


        pvr纹理支持pvrtc纹理压缩格式,他主要采用有损压缩。如果拿pvrtc图片和jpg图片对比的话,他只有jpg图片的中等质量,但是他最大的好处是可以不用再内存里面解压缩纹理。

        pvrtc2和pvrtc4是两种pvr压缩的图像格式,他们都是pvr文件。这两种图像格式比普通图像有更快的加载速度和更小的内存占用。

        pvrtc4:4字节每像素,良好的图片质量,占用内存仅为RBGA8888格式的1/8

        pvrtc2:2字节每像素,较差的图片质量,占用内存仅为RGBA8888格式的1/16



NOPT是“non power of two”的缩写,译作“不是2的幂”。NPOT stands for “non power of two”. 在cocos2d1.x的时候,你必须在ccConfig.h文件中开启对NPOT的支持,但是,cocos2d 2.x就不需要了,它默认是支持NPOT的。所有3代(iphone 3GS)以后的ios设置都支持cocos2d 2.x(因为它们支持OpenGL ES2.0),所以也都能支持NPOT纹理。

如果纹理图集(texture atlas)使用NPOT的纹理,它将有一个具大的优势:它允许TP更好地压缩纹理。因此,我们会更少地浪费纹理图集的空白区域。而且,这样的纹理在加载的时候,会少使用1%到49%左右的内存。而且你可以使用TP强制生成NPOT的纹理。(你只需要勾选“allow free size”即可)

为什么要关心NPOT呢?因为苹果的OpenGL驱动有一个bug,导致如果使用POT的纹理,则会产生额外33%的内存消耗。

这篇关于图片格式及内存占用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044798

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

PHP内存泄漏问题解析

内存泄漏 内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉 PHP的内存泄漏 PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内

C++学习笔记----6、内存管理(四)---- 通常的内存陷阱(2)

3、Windows环境下使用Visual C++发现并修复内存渗露         内存渗露很难跟踪是因为你无法很容易地看着内存并且看到什么对象处于使用中,一开始在哪儿分配的内存。然而,是有程序可以为你做到这一点的。内存渗露检测工具有昂贵的专业软件包,也有免费下载的工具。如果你是在Microsoft Visual C++环境下工作,它的排错工具库有内建的对于内存渗露检测的支持。该内存检测默认没有

控制台和MFC中内存泄露工具vld的使用

最近想检测下项目中内存泄露的情况,选中了vld这款。在查找使用方法的时候,大都是控制台下的示例,添加到main函数所在的源文件上。换成MFC就纠结了,不知道添加到哪里去。本文记录控制台和MFC中的使用vld过程。    vld资源:    1)、大家可以移步下边的网址下载:     http://vld.codeplex.com/releases/view/82311    2