UPL10-3——纹理资源优化

前置知识:U3L2——图片导入概述

纹理优化的核心理念

纹理是运行时内存占用的大头,优化目标是平衡视觉质量与内存、显存占用
核心矛盾:视觉保真度 和 内存、显存、加载时间的平衡

纹理优化决策流程:

  1. 根据用途选择正确的 Texture Type 和设置

  2. 绝不使用超过需要的纹理尺寸

  3. 为不同平台选择最优压缩格式、

    平台 首选 备选 HDR格式 法线 遮罩贴图 特殊用途
    PC BC7 BC3 BC6H BC5 DXT1|BC1 BC1、BC4(单通道)
    Android ASTC 4x4 ETC2 4bit ASTC HDR 6x6 ASTC 5x5 ETC2 4bit ASTC 6x6(远景、小道具)
    IOS ASTC 4x4 ASTC 6x6 ASTC HDR 4x4 ASTC 5x5 ASTC 6x6|8x8 EAC R/RG
    WebGL ASTC 4x4 DXT1/DXT5,ETC2,PVRTC BC6H BC5 DXT1|BC1 ASTC 6x6 / DXT1
  4. 合理使用 Mipmap 和纹理流式加载

  5. 严格管理纹理生命周期,及时释放资源

纹理导入设置优化

纹理导入设置是优化的第一道关卡,关键参数如下:

  1. Texture Type(纹理类型)

    • Default:通用纹理
    • Normal map:法线贴图,使用特定压缩
    • Sprite:2D 精灵
    • Cube map:立方体贴图,用于天空盒等
    • UI:GUI 纹理
  2. Max Size(最大尺寸)

    绝不使用超过实际需要的尺寸,根据用途选择:

    • UI 图标:尽量 128*128 或 256*256
    • 手机角色纹理:尽量 1024*1024
    • 主机 / PC 大角色:尽量 2048*2048
    • 天空盒/远景:尽量 512*512 或 1024*1024
  3. Format(格式)

    原则:永远使用压缩纹理,相比未压缩格式,压缩纹理可以减少 4 到 8 倍的内存占用
    不同平台使用哪种格式在下文(纹理压缩格式详解)详细解释

  4. Generate Mip Maps(生成Mipmap)

    勾选:纹理在远处自动使用低分辨率版本

    • 优点:减少远处像素闪烁,提升渲染性能
    • 缺点:增加约 33% 内存占用
    • 适用:3D 场景中的纹理
    • 不适用:UI、2D 精灵、粒子纹理
  5. sRGB (Color Texture)

    • 勾选:颜色纹理(漫反射贴图、UI等)
    • 不勾选:非颜色数据(法线贴图、金属度、粗糙度等)

纹理类型选择策略:

  1. 标准颜色纹理

    • Texture Type: Default
    • sRGB: 勾选
    • Generate Mip Maps: 勾选 (3D场景)
  2. 法线贴图

    • Texture Type: Normal map
    • sRGB: 不勾选
    • Generate Mip Maps: 不勾选
  3. UI 精灵

    • Texture Type: Sprite (2D and UI)
    • sRGB: 勾选
    • Generate Mip Maps: 不勾选
  4. 立方体贴图

    • Texture Type: Cube map
    • sRGB: 根据内容决定
    • Generate Mip Maps: 勾选

纹理压缩格式详解

不同平台压缩格式推荐:

PC

d34ceddd1fa13a3203d6c56be523153d

  1. RGB(A) Compressed BC7

    提供极高的质量,支持平滑的 Alpha 通道
    所有 DirectX 11 及以上级别的显卡均支持
    但若目标是兼容极老设备(DX10 或更早),则需退回到 BC3

  2. RGB HDR Compressed BC6H

    专为 HDR 纹理设计(如天空盒、HDR环境贴图)
    这是 HDR 内容的唯一正确选择

  3. 高效备选

    • RGB Compressed DXT1 和 RGBA Compressed DXT5
    • RG Compressed BC5 用于法线贴图
  4. 特殊用途

    • R Compressed BC4 单通道数据(如高度图、粗糙度图)的专用格式,压缩效率极高
    • RGBA Crunched DXT5 仅在安装包 / 下载体积是硬性指标时使用。会增加加载时的 CPU 开销
    • RGB Crunched DXT1 同上,用于无 Alpha 的纹理

因此:

  • 标准颜色纹理(漫反射、UI、图标):RGB(A) Compressed BC7 或 RGBA Compressed DXT5 | BC3

  • 法线贴图:RG Compressed BC5

  • 金属度/粗糙度/AO 等遮罩贴图:RGB Compressed DXT1|BC1

    高级用法:使用 R Compressed BC4 分别压缩单个通道,然后通过着色器采样组合

  • HDR 纹理(天空盒、环境贴图):RGB HDR Compressed BC6H

注意:Compressed(压缩)和 Crunched(紧缩)的区别
想要极值的最小化纹理用 Crunched 紧缩模式,但是会牺牲一些加载性能(运行时会先解压在上传GPU)
如果没有太大的包体大小压力,可以使用 Compressed(压缩),会获取更快的加载速度

Android

  1. 首选 RGB(A) Compressed ASTC 4x4 block

    它是性能、质量和兼容性最佳的平衡点,它支持透明通道

  2. 次选 RGB Compressed ETC2 4 bits

    不带 Alpha 通道纹理的高效选择,压缩率更高,如果包体大小是首要考虑,且纹理无透明,可选它

  3. 备用

    1. RGBA Compressed ASTC 6x6 block

      在质量和体积间平衡,适合不重要的环境纹理、远景贴图

    2. RGBA Compressed ASTC 5x5 block

      非常接近 ASTC 4x4 的质量,但体积更小。是法线贴图的绝佳选择

    3. RGBA Compressed ETC2 8 bits

      ASTC 的备胎,如果遇到极少数不支持 ASTC 但支持 ETC2 的设备,可作为后备

因此:

  • 标准颜色纹理(漫反射贴图、UI 等:RGBA Compressed ASTC 4x4 block
  • 法线贴图:RGBA Compressed ASTC 5x5 block
  • 金属度/粗糙度/AO 等单通道遮罩贴图:RGB Compressed ETC2 4 bits
  • HDR 纹理(如天空盒):RGB(AB) Compressed ASTC HDR 6x6 block
  • 极其不重要的纹理(远景、小道具):RGBA Compressed ASTC 6x6 block

IOS

  1. RGBA Compressed ASTC 4x4 block

    所有支持 Metal 的 iOS 设备(A7 芯片及以上)均有硬件解码支持,质量优异,性能最佳

  2. RGB(A) Compressed ASTC 6x6 block

    它是性价比之选,适合对质量不敏感的环境纹理、远景贴图,能显著节省内存

  3. RGB(A) Compressed ASTC 5x5 block

    法线贴图的绝佳选择,在精度和体积间取得完美平衡

因此

  • 标准颜色纹理(漫反射、UI、精灵):RGBA Compressed ASTC 4x4 block 或 RGB(A) Compressed ASTC 6x6 block
  • 法线贴图:RGB(A) Compressed ASTC 5x5 block
  • 金属度/粗糙度/AO 等遮罩贴图:RGB(A) Compressed ASTC 6x6 block 或 RGB(A) Compressed ASTC 8x8 block
  • HDR 纹理(天空盒、光晕、粒子):RGB(A) Compressed ASTC HDR 4x4 block
  • 单通道或双通道数据(高度图、灰度图):R Compressed EAC 4 bit (单通道) 或 RG Compressed EAC 8 bit (双通道)

WebGL

WebGL 是非常特殊的平台,因为作为网页应用可以在各操作系统各浏览器中运行
它的压缩格式的兼容性是主要要考虑的内容,我们选择了格式后,应该尽量多的进行平台和浏览器测试

  1. RGB(A) Compressed ASTC 相关格式 (推荐的格式)

    现代浏览器的黄金标准,这是质量和性能的最佳选择

  2. 所有 DXT/BC 开头的格式

    在 Windows 和 Mac 的主流浏览器上支持极好,适合桌面端

  3. 所有 ETC2 和 ETC 开头的格式

    是 OpenGL ES 3.0 标准,在大多数浏览器中也得到良好支持,广泛支持于 Android。

  4. 所有 PVRTC 开头的格式

    这是 Safari 的原生格式。如果你的用户主要是苹果设备用户,可以包含它作为后备

因此:

  • 标准颜色纹理(漫反射、UI):RGB(A) Compressed ASTC 4x4 block
  • 法线贴图:RGB Compressed BC5
  • HDR 纹理(天空盒):RGB HDR Compressed BC6H
  • 需要极致包体大小:RGBA Compressed ASTC 6x6 block 或 RGB Compressed DXT1|BC1

内存与性能优化

  1. 纹理流送 (Texture Streaming)

    • 作用:按需将纹理 mip 级别加载到显存

    • 适用:大型开放世界,内存敏感项目

      如果不开启,一个 2048*2048 的纹理,会将其所有Mip级别(1024*1024, 512*512, …, 1*1)都加载到内存
      而开启后,假设一个在远处的小物体,可能只需要 256*256 或 128*128 的 Mip 级别就能满足视觉需求
      系统就只加载这个低级别到内存,从而节省大量的内存

    • 设置:在 Project Setting - Quality 设置中开启 Mipmap Streaming (Unity 2022 及以前版本此设置项名为 Texture Streaming)

      image

    • 预算:设置纹理流送内存预算

      image

      1. Add All Cameras (添加所有摄像机):

        勾选后场景中所有摄像机都会参与计算,不勾选只有被标记为 Main Camera 的摄像机会参与计算

      2. Memory Budget (内存预算)

        设定 Mipmap Streaming 系统可以使用的总内存预算(单位为 MB)
        系统会尝试将活动纹理所需的 Mip 级别控制在这个预算内,如果预算太低,可能会导致纹理频繁流送,产生性能波动

      3. Renderers Per Frame (每帧渲染器数量)

        每帧最多计算多少个渲染器所需的 Mip 级别
        在大型场景中,如果发现远处纹理加载过慢,可以适当调高此值(如 1024)
        如果遇到 CPU 峰值,则降低它

      4. Max Level Reduction (最大级别缩减)

        允许纹理的 Mip 级别相对于其最大值最多降低多少级
        这是一个质量保护参数,值为 2 意味着一个 2048*2048(最大 mip 为11级)的纹理
        最多只能被降低到使用 512*512(降低 2 级后为第 9 级)的 Mip,而不会被降到更模糊的 256*256 级别

      5. Max IO Requests (最大 I/O 请求数)

        限制每帧同时进行的磁盘读取请求数量
        这是一个 I/O 保护参数,从硬盘加载 Mip 数据会产生 I/O 操作
        此参数防止系统在一帧内发起过多请求,阻塞磁盘
        对于安装在 SSD 上的项目,可以设置得较高(如 1024)
        对于机械硬盘或网络流送,应设置得较低(如 128-256)

  2. 各向异性过滤 (Anisotropic Filtering)

    • 作用:改善倾斜角度观察纹理的质量

    • 性能消耗:轻微

    • 建议:根据项目需求开启

    • 设置:在 Project Setting - Quality 设置中设置 Anisotropic Textures (各向异性纹理)

      image

    • 建议:

      • PC / 主机:Force On(全部开启)
      • 高端移动端:Per Texture(按纹理设置)
      • 低端移动端:Disabled(关闭)

    然后在纹理中设置 Aniso Level (各向异性级别)

    • 地面、道路、桌面(经常被倾斜观察):Aniso Level = 8 或 16
    • 角色皮肤、墙壁(大多被正对观察):Aniso Level = 1 或 2
    • UI、精灵(永远是正对):Aniso Level = 0
  3. 纹理图集 (Texture Atlas)

    • 作用:将多个小纹理合并为一个大纹理
    • 优点:减少 DrawCall,优化合批
    • 适用:UI 元素、2D 精灵、道具图标

生命周期管理

  1. 资源管理系统

    使用 Addressables​ 或 AB 包管理大纹理
    场景切换时及时卸载未使用纹理
    避免 Resources.Load 导致的内存泄漏

  2. 动态加载策略

    • 重要纹理:场景加载时预加载
    • 次要纹理:触发时异步加载
    • 可选纹理:按需加载+缓存
  3. 对象池应用

    对频繁使用的 RenderTexture 使用对象池,复用临时渲染目标

  4. 内存监控

    使用 Profiler 监控 Texture 内存
    设置纹理内存预警机制,低内存时自动释放非关键纹理

其它优化技巧

  1. 纹理尺寸适配

    对于 2 的幂尺寸的纹理,特别是 UI 图集,2D 纹理图集,我们应该尽量填满对应尺寸
    不要留空白,否则会浪费内存,对于一些支持最新图形接口程序的平台
    如果不需要使用 Mipmap,我们完全可以使用非 2 的幂的纹理,可以节约一些内存

  2. 通道打包

    将金属度、粗糙度、AO 等单通道纹理打包到 RGBA 不同通道
    示例:R = 金属度, G = 粗糙度, B = AO, A = 自发光

  3. 动态分辨率纹理

    根据设备性能动态调整渲染纹理分辨率,适用:后处理效果、UI 渲染纹理

  4. 纹理格式选择决策流程:

    1. 确定纹理用途 (颜色 / 法线 / 数据)
    2. 选择对应 Texture Type
    3. 根据目标平台选择压缩格式
    4. 根据重要性选择压缩质量
    5. 设置合适 Max Size
  5. 测试验证

    在目标设备上验证纹理质量,使用 Frame Debugger 分析纹理采样,监控纹理流送效果