性能优化(3)静态资源优化——纹理基础概念

  1. 1. 纹理基础概念
  2. 2. 纹理类型
  3. 3. 纹理大小
  4. 4. 纹理颜色空间
  5. 5. 纹理压缩
  6. 6. 纹理图集
  7. 7. 纹理过滤
  8. 8. 纹理的Mipmap

纹理基础概念


纹理类型

  • Default:默认的纹理类型格式
  • Normal map:法线贴图,可将颜色通道转换为适合实时法线贴图格式
  • Editor GUI and Legacy GUI:在编辑器GUI控件上使用纹理请选择此类型
  • Sprite(2D and UI):在2D游戏中使用的精灵(Sprite)或UGUI使用的纹理请选择此类型
  • Cursor:鼠标光标自定义纹理类型
  • Cookie:用于光照Cookie剪影类型的纹理
  • Lightmap:光照贴图类型的纹理,编码格式取决于不同的平台
  • Single Channel:如果原始图片文件只有一个通道,请选择此类型

纹理大小

  • 纹理的大小直接影响内存与显存占用的大小,同时对GPU纹理采样、CPU加载和带宽造成影响

  • 选择合适纹理大小应尽量遵循以下经验:
    · 不同平台、不同硬件配置选择不同的纹理大小,Unity下可以采用bundle变体设置多套资源、通过Mipmap限制不同平台加载不同level层级的贴图
    · 根据纹理用途的不同选择不同的纹理加载方式,如
    流式纹理加载Texture Streaming、稀疏纹理
    Sparse Texture、虚拟纹理VirtualTexture等方式
    · 不能让美术人员通过增加纹理大小的方式增加细节,可以选择细节贴图DetailMap或增加高反差保留的方式
    · 在不降低视觉效果的情况下尽量减小贴图大小,最好的方式是纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小,如果纹理小了会造成欠采样,纹理显示模糊;如果纹理大了会造成过采样,纹理显示噪点。这一点做到完美很难保障,充分利用SceneView -> DrawMode -> Mipmap来查看在游戏摄像机视角下哪些纹理过采样,哪些纹理欠采样来调整纹理大小
    · 现代显卡对纹理的支持为2的幂次方,如1024x1024、512x256,不要求长宽相等,只要求长宽大小为2的幂次即可。不符合大小的纹理,Unity在导入时会自动设置成最小符合2的幂次方的大小,但这样的设置一定会造成纹理大小的浪费

纹理颜色空间

  • 只需了解一下,知道纹理导入选项中的sRGB选项什么时候开启什么时候关闭即可
  • 默认大多数图像处理工具都会使用sRGB颜色空间处理和导出纹理。但如果你的纹理不是用作颜色信息的话,那就不要使用SRGB空间,如金属度贴图、粗糙度贴图或者法线贴图等。一旦这些纹理使用SRGB空间会造成视觉表现错误

纹理压缩

  • 纹理压缩是指图像压缩算法,保持贴图视觉质量的同时,尽量减小纹理数据的大小。默认情况下我们的纹理原始格式采用PNG或TGA这类通用文件格式,但与专用图像格式相比他们访问和采样速度都比较慢,无法通用GPU硬件加速,同时纹理数据量大,占用内存较高。所以在渲染中我们会采用一些硬件支持的纹理压缩格式,如ASTC 、ETC、ETC2、DXT等
    可以看到在质量相差不大的情况下ASTC6x6压缩下大小可以减少到接近未压缩的十分之一

纹理图集

  • 是一系列小纹理图像的集合
  • 优点:
    · 一是采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用次数
    · 二是纹理图集可以减少碎纹理过多,因为他们打包在一个图集里,通过压缩可以有效的利用压缩,隆低纹理的内存成本和冗余数据
  • 缺点
    · 美术需要合理规划模型,并且要求模型有相同的材质着色器,或需要制作通道图去区分不同材质。制作和修改成本较高

纹理过滤

纹理的Mipmap

  • 逐级减少分辨率来保存纹理副本,可以理解为纹理的LOD层级。渲染纹理时,将根据像素在屏幕中占据的纹理空间大小选择合适的Mipmap级别进行采样
  • 优点:
    · GPU不需要在远距离上对对象进行全分辨率纹理采样,因此可以提高纹理采样性能
    · 同时也解决了远距离下的过采样导致的噪点问题,提高了纹理渲染质量
  • 缺点:
    · 由于Mipmap纹理要生成低分辨率副本,会造成额外的内存开销