赞
踩
这个主要是关于Unity当中图片资源,纹理贴图压缩格式相关的优化内容。
当我们把图片导入Unity的时候,在属性面板当中我们会根据不同平台进行格式压缩也就是Format选项。但是点开的时候会出现超多选项,如果不熟悉其中各个选项的作用整个人就是处于懵逼状态
如下图:
不知道选择哪个更适合当前的平台,下面让们一步步的进行了解。
RGBA32:32代表RGBA这4个通道总共占32位,也就是每一个通道占8位
RGBA16:16代表RGBA这4个通道总共占16位,也就是每一个通道占4位
位数越多,代表越清晰,颜色越丰富
一个字节(Byte)是8位,一个位是一个比特(bit),也就是1Byte = 8bit
常见的图片格式主要以PNG和JPG为主
PNG:无论压缩有透明
JPG:有损压缩无透明
无论我们导入什么格式的图片到Unity,Uniy都会转化为纹理格式的图片Texture2D
之所以要转化为纹理格式是因为图像为了存储信息而使用对信息的特殊编码方式,存储在磁盘或内存当中无法被GPU识别。而纹理格式是针对GPU的压缩格式GPU可以直接读取。
不同系统的GPU对于解压格式是不同的,无法使用一个压缩格式针对所有平台。比如有些格式可以再Android上使用但无法在IOS上使用,那么Unity会将无法读取的纹理格式同意转换为RGBA格式,RGBA是都认的。但是RGBA格式比较大,RGBA是无损的尤其是RGBA32,高清无压缩。
通常为了优化DrawCall,我们会把同一个UI界面上的图片放进一个图集里面,Unity的图集长宽只会是2的幂次方,比如:256*256 512*512等。而且图集占用内存的大小只和他的压缩格式和长宽有关,与图集中图片数量无关。Unity会根据图集内的图片大小自动调整图集大小,如果有新的图片放入图集,Unity会自动调整图集中所有图片的位置给新的图片腾出一块地方。当图片无论如何都放不下这张新图片时,Unity就会给图片换个合适的大房子,也就是将图片的长宽变大。此时图集占用的内存就会翻倍 如:256*256 --> 512*512 --> 1024*1024 --> 2048*2048。
所以我们应该尽可能地让一张图集放入最多的图片,不浪费图集上每一个地方。图集大小最好(必须)控制1024*1024。一旦超过1024*1024的图集占用内存会非常的大,而且通常会导致一些不必要的内存占用。比如过大的背景图可以切成多个块打包进图集,然后在Unity UI中拼接起来。
针对不同的平台,不同的贴图资源,结合实际需求可以选择不同的压缩格式,能够大大减少内存的占用。在项目中尽可能使用ETC2和PVRTC4等GPU直接支持的图片格式,不仅内存占用低性能特可以更好。只有当出现质量不及格时,在逐步的提升压缩格式来满足需求。
MipMap在UI贴图上一定要取消勾选它有点类似LOD技术,LOD技术主要针对的是模型资源。而MipMap针对的是纹理贴图,勾选MipMap后Unity会生成八个精度不同的贴图,根据贴图与摄像机距离远近选择不同精度的贴图。距离摄像机越远显示的贴图像素越低,反之像素越高。所以勾选MipMap必然会产生过大的占用内存,大概会将内存提升30%。因为大多数UI图片都是渲染在屏幕最上层所以没有太大必要勾选,对于具有较大纵深感的3D游戏,3D场景和角色一般建议勾选MipMap能有效的降低渲染宽带的压力,提升游戏的渲染效率。
为了让贴图在手机中运行时占用尽可能少的内存,需要设置贴图的压缩格式。目前Unity针对Android和IOS支持的压缩格式有:Android上的ETC和ETC2,IOS上的PVRTC和ASTC。以下是这四种格式的特点:
ETC:不支持透明通道,被所有Android设备支持
ETC2:支持透明通道,Android设备GPU必须支持OpenGL ES3.0才可以使用,对于不支持的设备上面有说到会以未压缩形式存在于内存中占用更多的内存。(Unity会将无法读取的纹理格式同意转换为RGBA格式,RGBA是都认的。但是RGBA格式比较大,RGBA是无损的尤其是RGBA32,高清无压缩)
PVRTC:所有苹果设备都支持,要求压缩纹理长宽相等且是2的幂次方(Power of 2)
ASTC:高质量低内存占用,未来可能普遍的压缩格式,现在有一部分机型不支持
一般来说目前Unity的手机游戏Android上非透明贴图会使用RGB Compressed ETC 4bits,有透明贴图情况下可以使用RGBA Compressed ETC2 8bits。IOS上非透明体图可以使用RGB Compressed PVRTC 4bits,有透明贴图的情况下RGBA Compressed PVRTC 4bits。
这里的bits概念的意思是每个像素占用的bit数举个例子:RGB Compressed PVRTC 4bits格式的1024*1024的贴图,其在内存中占用的大小 = 1024x1024x4(bits) = 4M(bits) = 512(Byte) = 0.5M
Android:
无透明通道选择ETC,被所有Android支持
有通明通道选择ETC2,Android GPU必须支持OpenGL ES3.0,目前Android机型基本覆盖
IOS:
PVRTC 支持通明通道 所有IOS技能都支持,要求压缩纹理长宽相等,并且是2的幂次方
ASTC 支持透明通道 高质量低占用内存,IOS设备必须Iphone6 A8处理器以上支持。如果在不支持的设备上使用会被软解压成RGBA,从而数倍增加其内存占用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。