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导致双倍的内存占用;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)