UPL10-3——纹理资源优化
UPL10-3——纹理资源优化
前置知识:U3L2——图片导入概述
纹理优化的核心理念
纹理是运行时内存占用的大头,优化目标是平衡视觉质量与内存、显存占用
核心矛盾:视觉保真度 和 内存、显存、加载时间的平衡
纹理优化决策流程:
-
根据用途选择正确的 Texture Type 和设置
-
绝不使用超过需要的纹理尺寸
-
为不同平台选择最优压缩格式、
平台 首选 备选 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 -
合理使用 Mipmap 和纹理流式加载
-
严格管理纹理生命周期,及时释放资源
纹理导入设置优化
纹理导入设置是优化的第一道关卡,关键参数如下:
-
Texture Type(纹理类型)
- Default:通用纹理
- Normal map:法线贴图,使用特定压缩
- Sprite:2D 精灵
- Cube map:立方体贴图,用于天空盒等
- UI:GUI 纹理
-
Max Size(最大尺寸)
绝不使用超过实际需要的尺寸,根据用途选择:
- UI 图标:尽量 128*128 或 256*256
- 手机角色纹理:尽量 1024*1024
- 主机 / PC 大角色:尽量 2048*2048
- 天空盒/远景:尽量 512*512 或 1024*1024
-
Format(格式)
原则:永远使用压缩纹理,相比未压缩格式,压缩纹理可以减少 4 到 8 倍的内存占用
不同平台使用哪种格式在下文(纹理压缩格式详解)详细解释 -
Generate Mip Maps(生成Mipmap)
勾选:纹理在远处自动使用低分辨率版本
- 优点:减少远处像素闪烁,提升渲染性能
- 缺点:增加约 33% 内存占用
- 适用:3D 场景中的纹理
- 不适用:UI、2D 精灵、粒子纹理
-
sRGB (Color Texture)
- 勾选:颜色纹理(漫反射贴图、UI等)
- 不勾选:非颜色数据(法线贴图、金属度、粗糙度等)
纹理类型选择策略:
-
标准颜色纹理
- Texture Type: Default
- sRGB: 勾选
- Generate Mip Maps: 勾选 (3D场景)
-
法线贴图
- Texture Type: Normal map
- sRGB: 不勾选
- Generate Mip Maps: 不勾选
-
UI 精灵
- Texture Type: Sprite (2D and UI)
- sRGB: 勾选
- Generate Mip Maps: 不勾选
-
立方体贴图
- Texture Type: Cube map
- sRGB: 根据内容决定
- Generate Mip Maps: 勾选
纹理压缩格式详解
不同平台压缩格式推荐:
PC

-
RGB(A) Compressed BC7
提供极高的质量,支持平滑的 Alpha 通道
所有 DirectX 11 及以上级别的显卡均支持
但若目标是兼容极老设备(DX10 或更早),则需退回到 BC3 -
RGB HDR Compressed BC6H
专为 HDR 纹理设计(如天空盒、HDR环境贴图)
这是 HDR 内容的唯一正确选择 -
高效备选
- RGB Compressed DXT1 和 RGBA Compressed DXT5
- RG Compressed BC5 用于法线贴图
-
特殊用途
- 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
-
首选 RGB(A) Compressed ASTC 4x4 block
它是性能、质量和兼容性最佳的平衡点,它支持透明通道
-
次选 RGB Compressed ETC2 4 bits
不带 Alpha 通道纹理的高效选择,压缩率更高,如果包体大小是首要考虑,且纹理无透明,可选它
-
备用
-
RGBA Compressed ASTC 6x6 block
在质量和体积间平衡,适合不重要的环境纹理、远景贴图
-
RGBA Compressed ASTC 5x5 block
非常接近 ASTC 4x4 的质量,但体积更小。是法线贴图的绝佳选择
-
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
-
RGBA Compressed ASTC 4x4 block
所有支持 Metal 的 iOS 设备(A7 芯片及以上)均有硬件解码支持,质量优异,性能最佳
-
RGB(A) Compressed ASTC 6x6 block
它是性价比之选,适合对质量不敏感的环境纹理、远景贴图,能显著节省内存
-
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 是非常特殊的平台,因为作为网页应用可以在各操作系统各浏览器中运行
它的压缩格式的兼容性是主要要考虑的内容,我们选择了格式后,应该尽量多的进行平台和浏览器测试
-
RGB(A) Compressed ASTC 相关格式 (推荐的格式)
现代浏览器的黄金标准,这是质量和性能的最佳选择
-
所有 DXT/BC 开头的格式
在 Windows 和 Mac 的主流浏览器上支持极好,适合桌面端
-
所有 ETC2 和 ETC 开头的格式
是 OpenGL ES 3.0 标准,在大多数浏览器中也得到良好支持,广泛支持于 Android。
-
所有 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
内存与性能优化
-
纹理流送 (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)

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

-
Add All Cameras (添加所有摄像机):
勾选后场景中所有摄像机都会参与计算,不勾选只有被标记为 Main Camera 的摄像机会参与计算
-
Memory Budget (内存预算)
设定 Mipmap Streaming 系统可以使用的总内存预算(单位为 MB)
系统会尝试将活动纹理所需的 Mip 级别控制在这个预算内,如果预算太低,可能会导致纹理频繁流送,产生性能波动 -
Renderers Per Frame (每帧渲染器数量)
每帧最多计算多少个渲染器所需的 Mip 级别
在大型场景中,如果发现远处纹理加载过慢,可以适当调高此值(如 1024)
如果遇到 CPU 峰值,则降低它 -
Max Level Reduction (最大级别缩减)
允许纹理的 Mip 级别相对于其最大值最多降低多少级
这是一个质量保护参数,值为 2 意味着一个 2048*2048(最大 mip 为11级)的纹理
最多只能被降低到使用 512*512(降低 2 级后为第 9 级)的 Mip,而不会被降到更模糊的 256*256 级别 -
Max IO Requests (最大 I/O 请求数)
限制每帧同时进行的磁盘读取请求数量
这是一个 I/O 保护参数,从硬盘加载 Mip 数据会产生 I/O 操作
此参数防止系统在一帧内发起过多请求,阻塞磁盘
对于安装在 SSD 上的项目,可以设置得较高(如 1024)
对于机械硬盘或网络流送,应设置得较低(如 128-256)
-
-
-
各向异性过滤 (Anisotropic Filtering)
-
作用:改善倾斜角度观察纹理的质量
-
性能消耗:轻微
-
建议:根据项目需求开启
-
设置:在 Project Setting - Quality 设置中设置 Anisotropic Textures (各向异性纹理)

-
建议:
- PC / 主机:Force On(全部开启)
- 高端移动端:Per Texture(按纹理设置)
- 低端移动端:Disabled(关闭)
然后在纹理中设置 Aniso Level (各向异性级别)
- 地面、道路、桌面(经常被倾斜观察):Aniso Level = 8 或 16
- 角色皮肤、墙壁(大多被正对观察):Aniso Level = 1 或 2
- UI、精灵(永远是正对):Aniso Level = 0
-
-
纹理图集 (Texture Atlas)
- 作用:将多个小纹理合并为一个大纹理
- 优点:减少 DrawCall,优化合批
- 适用:UI 元素、2D 精灵、道具图标
生命周期管理
-
资源管理系统
使用
Addressables 或 AB 包管理大纹理
场景切换时及时卸载未使用纹理
避免Resources.Load导致的内存泄漏 -
动态加载策略
- 重要纹理:场景加载时预加载
- 次要纹理:触发时异步加载
- 可选纹理:按需加载+缓存
-
对象池应用
对频繁使用的
RenderTexture使用对象池,复用临时渲染目标 -
内存监控
使用 Profiler 监控 Texture 内存
设置纹理内存预警机制,低内存时自动释放非关键纹理
其它优化技巧
-
纹理尺寸适配
对于 2 的幂尺寸的纹理,特别是 UI 图集,2D 纹理图集,我们应该尽量填满对应尺寸
不要留空白,否则会浪费内存,对于一些支持最新图形接口程序的平台
如果不需要使用 Mipmap,我们完全可以使用非 2 的幂的纹理,可以节约一些内存 -
通道打包
将金属度、粗糙度、AO 等单通道纹理打包到 RGBA 不同通道
示例:R = 金属度, G = 粗糙度, B = AO, A = 自发光 -
动态分辨率纹理
根据设备性能动态调整渲染纹理分辨率,适用:后处理效果、UI 渲染纹理
-
纹理格式选择决策流程:
- 确定纹理用途 (颜色 / 法线 / 数据)
- 选择对应 Texture Type
- 根据目标平台选择压缩格式
- 根据重要性选择压缩质量
- 设置合适 Max Size
-
测试验证
在目标设备上验证纹理质量,使用 Frame Debugger 分析纹理采样,监控纹理流送效果
