[概念]纹理的像素格式
发表于2018-05-10
本片文章和大家科普下纹理的像素格式的概念只是,其中纹理的像素格式是图像存储在GPU内存的方式。TexturePacker纹理格式截图
你可能会见到以下像素格式:
- RGBA8888(32位)(kTexture2DPixelFormat_RGBA8888)
- RGBA4444(16位)(kTexture2DPixelFormat_RGBA4444)
- RGB5_A1(16位)(kTexture2DPixelFormat_RGB5A1)
- RGB565(16位)(kTexture2DPixelFormat_RGB565)
RGBA8888:
红色通道,绿色通道,蓝色通道,alpha(透明度)通道各8位。如果想获取做好的图片资粮,使用这种格式最靠谱。
手机上占用内存太大,这个格式占用空间计算:以1024*1024计算图片占用空间 1024*1024*4 = 4M
常用地方:整个场景背景图片,大量渐变色的图片。
以RGBA8888格式(2048*2048)计算内存:
图片占用内存: 2048*2048*32/8/1000/1000 = 16M
1M = 1000KB; 1KB = 1000字节;1字节 = 8 位;32 = 8 + 8 + 8 + 8 位
2048和2048为长宽
OpenGL ES生成纹理在生成纹理时大小会自动扩展成2的幂次方。不足自动向下调整
例:85*121图片 生成纹理就是 128 * 128 占用内存64k
BGRA8888:
蓝色通道,绿色通道,红色通道,alpha(透明度)通道各8位。同上只不过像素格式顺序不一样,不是特别常用
RGBA4444:
红色通道,绿色通道,蓝色通道,alpha(透明度)通道各4位。对每个通道都有不错的支持,还能保证相对良好的速度和内存占用率。
常用地方:需要有不同的透明度精灵。
RGB888:
红色通道,绿色通道,蓝色通道,各8位。没用alpha通道。
常用地方:用在没有透明度的图片。游戏背景图像
RGB565:(*.jpg是565的一种格式)
红色通道5位,绿色通道6位,蓝色通道5位,这可怜的孩子没有Alpha通道。尽最大努力的给你一个高品质的16位纹理,前提是你不需要透明度的支持。
常用地方:游戏背景图
RGBA5551 (别名:RGB5A1):
红色通道5位,绿色通道5位,蓝色通道5位,Alpha通道1位。RGB通道表现良好,但是Alpha通道就惨了。内存占用和速度上表现不错。
常用地方:精灵需要透明度的表现,但是透明度的表现只有两种:开或关。
RGBA5555:
红色通道5位,绿色通道5位,蓝色通道5位,Alpha通道5位。各方面表现都比较良好
PVRTC2(iPhone的图形芯片(PowerVR MBX)对一种称为 PVRTC 的压缩技术提供硬件支持):
所有颜色和透明度占2个字节(品质可能有点低)
PVRTC4:(ios产品专用)
所有颜色和透明度占4个字节,在ios上基本都用这个格式
PVRTC2_NOALPHA:
RGB占用2个字节,没用ALPHA通道
PVRTC4_NOALPHA:
RGB占用4个字节,没用ALPHA通道
ETC1:
是android通用纹理的压缩格式,几乎所有的android机器都支持,是opengles2.0的标准。不像pvrtc4只是部分powervr的显卡支持。
ETC1图片不支持半透明(有替代方案可以使etc1图片兼容半透明显示),内存占用只有正常RGBA8888的八分之一(一个像素0。5个字节),并具有极高的加载速度。
ETC1的图片大小只跟图片的尺寸有关系,在大小上无法媲美jpg或png8的图片。
RGBA各占用0.5个字节
S3TC:(dds的一种格式):
是wp8手机支持的通用纹理压缩格式。RGBA各占用0.5个字节
RBGA8888其他RGB格式,不能被显卡所认可,需要开辟临时内存来读取,假如是2048*2048占用内存16M,读取的时候会临时增到32M。渲染完成,又变为16M
pvr, etc1,s3tc,可以被显卡所认可,而不需要开辟临时内存来读取,所以即便同为argb8888格式,pvr也会比png有效率。虽然不会节约程序稳定的运行内存,但是会避免加载大量图片时内存暴涨。
格式压图原理:
RBGA8888 R 8位 2^8 = 256 可以表现出来256种不同的红色
RBGA5555 R 8位 2^5 = 32 可以表现出来32种不同的红色
如果RBGA8888转换为RBGA5555,比如红色,会去掉一些红色的显示,用同一种红色代替,从而减少内存。
来自:https://blog.csdn.net/shimazhuge/article/details/77969628