首页
登录 | 注册

游戏中的压缩纹理格式

转载请标明出处:http://www.cnblogs.com/zblade/

一、概要

归纳总结游戏中使用到的各种纹理压缩格式,详解各自的来源和原理。

二、图片格式和纹理格式

2.1 图片格式和纹理格式

图片格式,是图片文件的存储格式,用于图片文件的存储和传输,通常在磁盘文件,内存以及网络传输中使用。

纹理格式是显卡能够直接进行采样的纹理数据的格式,是向显卡中加载纹理时使用的数据格式。

图片格式和纹理格式的关系,就是没有关系。如果图片要传输给显卡使用,则必须转换成显卡能够识别的纹理格式,这个在游戏引擎中,会对应自动转换,也可以通过相关的代码设置显式的转换。

常见的图片格式,有 jpg, png, bmp, tga, psd, dds, Gif, 游戏中一般用png, tga两种格式,jpg由于不带透明通道,所以不常被游戏采用。 psd容易做成较大的图,所以也被摒弃。

纹理格式,其实就是针对显卡而设置的一些图片的数据格式。将图片加载为纹理的时候,需要将图片格式按照对应的规范解码,一般先解码为原始位图,然后重新编码为需要的纹理格式,当然这个过程引擎已经做好,不需要我们过多关注。

这样的过程,有一个问题,就是加压缩,解码,重新编码压缩的过程比较消耗CPU,如果在游戏总实时的执行这样的一个过程,会出现明显的卡顿掉帧。为了解决这个过程,一般在项目中,在资源导入或者打bundle的时候,会执行相关配套的纹理格式转换,最终打入游戏包或者Bundle中的是已经预先转换好的纹理格式,这样加载的时候优化了解码和转换的过程,能够提高加载速度。这也是为什么不同平台的bundle不能跨平台使用的原因之一。

2.2 移动GPU的四大厂商

目前市面上的GPU的四大厂商有:

  • Imagination Technologies的PowerVR SGX系列,代表是 Apple/iPad系列,三星部分系列
  • Qualcomm的Adreno系列, 代表作是 HTC,小米部分系列
  • ARM的Mali系列,代表作是三消的Galaxy系列
  • nVIDIA的Tegra系列,代表作是Google Nexus等

2.3 常见的纹理格式

常见的纹理格式有以下几种: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8, 总共四种基本纹理格式,

  • R5G6B5 每个像素占用2个字节(BYTE)
  • A4R4G4B4 每个像素占用2个字节
  • A1R5G5B5 每个像素占用2个字节
  • R8G8B8 每个像素占用3个字节
  • A8R8G8B8 每个像素占用4个字节

对于一个512 * 512大小的纹理,如果使用R5G6B5的纹理格式,其大小为512 * 512 * 2 = 512KB, 用A8R8G8B8, 就是1M,可以预见,游戏中占用容量最大将是各种纹理,很容易导致游戏安装包突破上G,为了缩小纹理格式的数据占用的内存大小,对应的压缩纹理格式产生了。注意,这不是在移动游戏出现后才产生的,早在PC端游戏时代就有压缩纹理格式。

三、压缩纹理格式

3.1 基于OpenGL ES的压缩纹理格式

代表性的压缩纹理格式有

  • ETC1(Ericsson texture compression)这种压缩纹理格式是OpenGL ES的图形标准,被所有的android设备支持,不支持透明通道,每个像素0.5个字节

  • PVRTC(PowerVR texture compression)
    支持GPU为PowerVR SGX系列,基本的压缩参数有:
    RGB_PVRTC_4Bit, RGB, 每个像素0.5个字节
    RGB_PVRTC_2Bit, RGB, 每个像素0.25个字节
    RGBA_PVRTC_4Bit, RGBA, 每个像素0.5个字节
    RGBA_PVRTC_2Bit, RGBA, 每个像素0.25个字节

  • ATITC(ATI texture compression) 支持GPU为Qualcomm的Adreno系列, 基本的压缩参数有:
    ATC_RGB_AMD, RGB, 每个像素0.5字节
    ATC_RGBA_EXPLICIT_ALPHA_AMD, RGBA, 每个像素1个字节
    ATC_RGBA_INTERPOLATED_ALPHA_AMD, RGBA, 每个像素1个字节

  • DXTC(又名S3TC,S3 texture compression) PC上广泛使用,基本的压缩参数有:
    RGB_S3TC_DXT1, RGB, 每个像素0.5个字节
    RGBA_S3TC_DXT1, RGBA, 每个像素0.5个字节
    RGBA_S3TC_DXT3, RGBA, 每个像素1个字节
    RGBA_S3TC_DXT5, RGBA,每个像素1个字节

3.2 后起的压缩纹理格式

  • ETC2
    针对ETC1不支持透明通道的改进,用ETC2可以支持透明通道,不过要求OpenGL ES3.0及以上(Android4.3+),目前基本覆盖率在9成以上
  • ASTC
    目前各大厂商主推的压缩纹理格式,压缩质量高,压缩块方案多,代价是压缩时间长(需要不断尝试压缩结果,算法决定)

3.3 各种压缩纹理格式对纹理格式图片的压缩比例

摘自网上的数据,没有具体的实测,以RGBA32的大小为1,那么各种压缩格式在存储上的大小为(不含ASTC):
RGB PVRTC 4Bits: 0.25
RGB PVRTC 2Bits: 0.13

ARGB PVRTC 4Bits: 0.25
ARGB PVRTC 2Bits: 0.13

RGBA ETC2 4Bits: 0.25
RGBA ETC2 8Bits: 0.25
RGB + 1-bit ALPHA ETC2 8Bits: 0.2

DXT1: 0.3
DXT5: 0.6

ARGB 16Bits: 0.33
ARGB 32Bits: 1
RGB 16Bits: 0.5
RGB 24Bits: 0.85

在内存中的对比,以RGBA32为1,其余压缩纹理格式的内存占用(不含ASTC):
ARGB 32 Bits: 1
ARGB 16 Bits: 0.5

RGB 24 Bits: 0.8
RGB 16 Bits: 0.5

DXT1: 0.125
DXT5:0.25

RGB PVRTC 4Bits: 0.125
RGB PVRTC 2Bits: 0.0625

ARGB PVRTC 4Bits: 0.125
ARGB PVRTC 2Bits: 0.0625

RGBA ETC2 4Bits: 0.125
RGBA ETC2 8Bits: 0.25
RGB+ 1-bit ALPHA ETC2 8Bits: 0.125

3.4 推荐使用的压缩纹理格式

目前(日本)市面上ES3.0的占比超过9成,Apple A8占比超过9成,推荐android使用ETC2, ios使用ASTC,或者PVRTC


相关文章

  • Python是什么? Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 G ...
  • 汝之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
        "描述一个事物,唯有一个名词定义它的概念,唯有一个动词揭露它的行为,唯有一个形容词表现它的特征.要做的,就是用心去寻找那个名词.那个动词.那个形容词--" -- 福楼拜 (Gustave Flaubert)   ...
  • 1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几个基础概念: 正向查询:关联字段所在的表 ...
  • java游戏开发杂谈
    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序关闭时消亡. 这个线程里执行的逻辑,支撑 ...
  • 转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 整理遇到的一些较难处理的bug,总结相关经验 二.主要问题 2.1 material类型的依赖修改 对于material类型的asset,如果修改了其s ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.077 s.
京ICP备10005923号