1、贴图,texture和atlas
TextureType贴图类型:
- Default: 普通贴图,这是所有纹理最常用的设置。
- Normal map: 法线贴图,选择此选项可将颜色通道转换为适合实时法线贴图的格式。
- Editor GUI and Legacy GUI: UI贴图,把Texture 用在 HUD or GUI controls.上。
- Sprite(2D and UI): 精灵图
- Cursor: 鼠标指针,如果您使用纹理作为自定义光标,请选择此选项。
- Cookie: 遮罩贴图
- Lightmap: 烘焙贴图
- Directional Lightmap: 烘焙贴图
- Shadownmask:
- Single Channel:如果你只需要纹理中的一个通道,选择这个。
sRGB(Color Texture):纹理颜色预处理
Alpha Source(α源):默认选择Input Texture Alpha就好,如果确定不使用原图中的Alpha通过,可以选择None。另外From Gray Scale一般不会选用。
Alpha Is Transparency:指定Alpha通道是否开启半透明,如果位图像素不关心是否要半透明可以不开启此选项。这样Alpha信息只需要占1bit。节省内存
Warp Mode:选择纹理平铺时的行为方式。默认选项为 Repeat。 All Texture Types
- Repeat:重复,在区块中重复纹理。
- Clamp:不重复,拉伸纹理的边缘。
- Mirror: 镜像,在每个整数边界上镜像纹理以创建重复图案。
- Mirror Once:镜像纹理一次,然后将其钳制到边缘像素。
- Per-axis:轴对称
FilterMode(决定纹理拉伸时采样哪种滤波模式):
- Point (no filter):最近邻滤波,缩放是采样像素数目只有一个;纹理在靠近时变为块状。
- Bilinear:使用线性滤波,找到四个近邻像素,然后进行线性插值混合得到,图像模糊了;纹理在靠近时变得模糊。
- Trilinear:几乎和Bilinear一样,只是如果开启多级渐远纹理技术,那就会在多级渐远纹理之间进行混合;与 Bilinear 类似,但纹理也在不同的 MIP 级别之间模糊。
官方文档:https://docs.unity3d.com/cn/2019.4/Manual/class-TextureImporter.html
2、atlas优化
优化前1024x1024*32/8/1024/1024=RGBA32Bit=4MB
优化后 91278832/8/1024/1024=RGBA32Bit=2.7MB
不是说贴图必须2的幂吗?,unity支持ASTC格式后,可以不用是2的幂了;
所以,912x788的一张图,在ASTC4x4,内存应该是多大?
912 * 788 * 8 / 8/1024/1024=ASTC4x4=0.68MB ~= 0.7MB
3、贴图内存计算
一张图在内存中占用的大小计算公式为:
图片占用内存的计算公式:图片高度 * 图片宽度 * 一个像素占用的内存大小 = 总byte
RGBA32 bit : 表示每个像素占用32位(bit)储存,1byte=8bit,32bit / 8 = 4byte字节 ,
内存大小 1024 x 1024 x 4 / (1024x1024) = 4M
512x512x4=1,048,576 byte
1,048,576 byte / 1024=1024kb
1024kb / 1024 = 1mb
(1):全平台,RGB和RGBA
RGBA32是R,G,B,A 使用32位来表示一个像素, 32 / 8=4 个字bit大小,带Alpha通道
RGBA16是R,G,B,A 使用16位来表示一个像素,16 / 8=2个字bit大小,带Alpha通道;
RGB24是R,G,B 使用24位来表示一个像素,24/8=3bit,不带Alpha通道;
RGB16是R,G,B 使用16位来表示一个像素,16/8=2bit,不带Alpha通道;
例如一张512x512的图,所占内存公式:
内存大小 = 宽 * 高 *(单个像素位 / 8一位8bit字节=单个像素占用bit字节)/ 1024(kb) / 1024(m)
RGBA32 = 512 x 512 x (32 / 8) / 1024 / 1024 = 1M
RGBA16 = 512 x 512 x (16 / 8) / 1024 / 1024 = 0.5M
RGB24 = 512 x 512 x (24 / 8) / 1024 / 1024 = 0.75M
RGB16 = 512 x 512 x (16 / 8) / 1024 / 1024 = 0.5M
ALPHA_8:只有 A 通道,占 8 位,1 个字节。每个像素点占用 1 个字节的大小
(2):Android,ETC和ETC2
ETC只能用于Android手机,长宽是2的幂,ETC是基于block块的纹理压缩格式,图像被分成4×4的块,每个块使用64位编码。
RGB-ETC 4bits是使用4位来表示一个像素, 4 / 8= 0.5bit,无Alpha通道
RGB-ETC2 4bits是使用8位来表示一个像素, 4 / 8=0.5bit,带Alpha通道
RGBA-ETC2 8bits是使用8位来表示一个像素, 8 / 8=1bit,无Alpha通道
RGB ETC 4bits = 512 x 512 x (4 / 8) / 1024 / 1024 = 0.125M
RGB ETC2 4bits = 512 x 512 x (4 / 8) / 1024 / 1024 = 0.125M
RGBA ETC2 8bits = 512 x 512 x (8 / 8) / 1024 / 1024 = 0.25M
(3):IOS,PVRTC
PVRTC只能用于ios手机,长宽正方形且2的幂
RGB PVRTC 2bits:使用2位来表示一个像素, 2 / 8=0.25bit,无Alpha通道
RGBA PVRTC 2bits:使用2位来表示一个像素, 2 / 8=0.25bit,有Alpha通道
RGB PVRTC 4bits:使用4位来表示一个像素, 4 / 8=0.5bit,无Alpha通道
RGBA PVRTC 4bits:使用4位来表示一个像素, 4 / 8=0.5bit,有Alpha通道
RGB PVRTC 2bits = 512 x 512 x (2/ 8) / 1024 / 1024 = 0.06M
RGBA PVRTC 2bits = 512 x 512 x (2/ 8) / 1024 / 1024 = 0.06M
RGB PVRTC 4bits = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M
RGBA PVRTC 4bits = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M
(4):全平台,ASTC(自适应可缩放纹理压缩)
ASTC是一种基于block块的有损纹理压缩格式,由ARM2012年推出的自适应可缩放纹理压缩方式。
像素大小 = 16-bytes / 分块宽高 * 8-bit;
压缩率 = 原始像素大小(32-bit) / 像素大小;
图像大小 = 原始图片大小 / 压缩率;
图片大小(MB)=长x宽x像素大小(bits)/8/1024/1024
unity2018之前,A通道独立
unity2019之后 A通道合并
RGB ASTC 4X4 block:使用8位来表示一个像素, 8 / 8=1bit ,无Alpha通道
RGB ASTC 4X4 block = 512 x 512 x (8/ 8) / 1024 / 1024 = 0.256M
RGBA ASTC 6X6 block:使用3.56bit来表示一个像素, 3.56 /8 =0.445bit ,无Alpha通道
RGB ASTC 8X8 block = 512 x 512 x (2 / 8) / 1024 / 1024 = 0.111M
(5):桌面端,PC
DXT是一种有损纹理压缩算法,基本思想是把4x4的像素块压缩成一个64或128位的数据块
RGB Compressed DXT1:使用4位来表示一个像素, 4 / 8=0.5bit ,无Alpha通道
RGB Compressed DXT1 = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M
RGBA Compressed DXT5:使用8位来表示一个像素, 8 / 8=1bit ,有Alpha通道,
RGBA Compressed DXT5 = 512 x 512 x (8/ 8) / 1024 / 1024 = 0.25M