Unity纹理压缩格式以及纹理设置

参考:

优化说明:Unity纹理压缩与相关优化知识汇总_unity texture compression-CSDN博客 

Unity官方的文档对于纹理压缩的说明:Recommended, default, and supported texture formats, by platform - Unity 手册

Unity 支持许多常见的图像格式作为导入纹理的源文件(例如 JPG、PNG、PSD 和 TGA)。但是,3D 图形硬件(例如显卡或移动设备)在实时渲染期间不会使用这些格式。这种硬件要求纹理以专门格式进行压缩,这些格式针对快速纹理采样进行了优化。不同的平台和设备分别都有自己的专有格式。

默认情况下,Unity Editor 会自动将纹理转换为最合适的格式,以匹配您选择的构建目标,而且构建中仅包含转换后的纹理。源资源文件保留为原始格式,位于项目的 Assets 文件夹中。但是,大多数平台支持多种纹理压缩格式,可供您进行选择。

Unity 为每个平台设置了默认格式,但您可以覆盖默认格式并为某些纹理选择不同的压缩格式(例如,如果使用纹理作为遮罩,只有一个通道,则可以选择使用 BC4 格式来降低文件大小,但同时保持质量)。

 注:压缩比越高,图片越小,显存占用越小,GPU开销降低,但是CPU需要来解压缩(解码)的消耗就越高,因此需要找到一个平衡点,达到负载均衡。

好在DXT,ETC等压缩纹理格式可以在游戏运行中无需CPU解压就被GPU直接采样,即能压缩纹理,还不用CPU解码,因此要选对对应平台的纹理压缩格式。

 

简而言之就是我们默认导入的Png图片,在实际打包后,就转为适合平台硬件的压缩格式(在工程里依旧是Png),有的压缩格式还能设置压缩质量。

一般导入图片Unity会自动帮我们设置各个平台的默认压缩算法,然后打包的时候根据平台压缩成对应的格式。

但我们仍旧可以手动指定压缩算法(必须是这个平台支持的算法,Unity的文档里可查),以及压缩质量等,比如下面这张图片,就从原始的1.06MB的Png压缩成只有59.6KB大小的RGB Crunched DXT1格式,也可选择不压缩的格式例如RGBA 32bit

注意兼容性:使用目标平台不支持的纹理压缩格式时,纹理将解压缩RGBA32(因为RGBA32是真彩色,并有alpha通道,它是最高质量的压缩格式,并使用于所有平台)并与压缩纹理一起存储在内存中,解压缩纹理以及存储两次浪费了时间和内存,因此需要针对不同的平台选择兼容的格式

关于虚拟贴图补充:Sparse Virtual Texture (虚拟贴图技术)-CSDN博客,注意,unity的虚拟贴图跟ue4的虚拟贴图好像不是同一个东西 

 

Unity给平台设置的默认压缩格式:

 

纹理压缩格式说明(可变表示这种压缩方式可以调整压缩质量):

 

纹理压缩格式支持的平台:

 上面括号内的数字表示:

 

纹理相关的性能优化

纹理过大会导致资源的加载、卸载耗时以及内存的占用增加(纹理资源的加载和内存占用一般是正相关的),纹理过大也会导致渲染时的带宽问题;而质量越高、文件越大,因此这是在品质和性能找到一个平衡;

1.纹理属性的设置

  • mipmap属性也会导致内存增加,也需要注意,一般UI资源都不需要勾选这两项的
  • 读写属性会导致内存加倍,而且一般不会用到;
  • NPOT和POT(图片尺寸二次幂):主要和mipmap,纹理的存储优化,以及纹理采样的地址计算等有关。如果是p2的话,做起上边这些就很简单了,基本上就是移位移位再移位,硬件做起来很简单,P2对硬件更加友好;这里一般要求美术资源在制作时就是满足pot的,如果美术资源不是,那么使用pot则会出现效果问题;
  • 如果美术资源已经有alpha通道,也可以在导入设置中设置Alpha Source为None;

2.纹理分辨率设置

没有什么比直接减少分辨率更直接有效的工作,就像我们都知道的道理:80%的优化来源于20%的工作,那剩下20%的优化才是真正耗费时间的。

要去限制美术出图的大小,他们不关心性能只关心效果,可能每一张图都想要2048x2048甚至更高,所以有的时候必须要在效果可以接受的基础上来降低分辨率,降低一个级别就是四倍的优化。

3.选择纹理压缩格式的策略

我们的思路是让需要展示出高品质的纹理占用更多的资源,让那些没必要展示高品质的纹理占用更少的资源;

  • 尽量避免RGBA32和ARGB32纹理的使用,因为这种格式一般属于高清晰的,但也比较耗;
  • RGBA16格式的加载效率也很高,接近于ETC1/PVRTC,设备越好,差距越小,因此在ETC1/PVRTC的效果不够好时,可以尝试用RGBA16;
  • UI贴图要注意Mipmap和read&write属性的设置;
  • 粒子贴图大小一般要在256x256一下;
  • 对于模型、场景贴图,我们需要根据不同用途的贴图做不同的压缩处理,如果使用ASTC格式,可以参考NVIDIA官网给出的测试数据来选择;
  • 在支持OpenGLES3.0的安卓设备上,ETC2是一个很好的处理带透明度的纹理格式,但是游戏需要在OpenGLES2.0设备上,则不要使用ETC2,因为该版本不支持ETC2,这样就会导致ETC2会被转成RGBA32导致双倍的内存占用;
posted @ 2024-07-24 10:46  JeasonBoy  阅读(208)  评论(0编辑  收藏  举报