图片格式及内存占用

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

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常