3.3 LOD 与纹理流送:让手机按需加载

核心结论

移动设备内存有限(中端机可用显存常不足 2GB),把整个游戏的所有高精度资产一次性载入是耍流氓。LOD 管几何、纹理流送管贴图,两者配合让手机"用到什么载什么"。

LOD:多级几何细节

为静态网格设置 3~4 级 LOD,远处自动换成低面数模型。官方有专门的按平台 LOD 指南(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/setting-up-per-platform-lods-5141),要点是移动端可以为每个平台单独配 LOD——同一个模型在 PC 上 4 级、移动上 3 级(合并最远的两级)。

LOD 配置建议表

LOD 级 屏幕占比(Screen Size) 三角面策略 用途
LOD0 >= 1.0 全精度 近景
LOD1 0.3~0.5 减面 50% 中景
LOD2 0.15~0.25 减面 75% + 合并材质 远景
LOD3 0.05~0.1 极简(或 billboard) 超远/俯瞰

移动端我一般砍掉 LOD0 的极端精度(比如把 LOD0 也稍微减面 10%),因为手机屏幕小,玩家根本贴不到 PC 那么近。

HLOD:大场景的终极大招

对大世界,把多个远处的物体合并成 HLOD(层级 LOD)集群,DrawCall 直降一个数量级。代价是构建时间长、内存占一份。中小关卡(<1km 见方)用不上,开放世界必备。

纹理流送:贴图的"按需取用"

纹理流送(Texture Streaming)决定贴图按相机距离分 mip 逐步载入。核心配置官方有专页(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/texture-streaming-configuratio-cbd2),移动端要调的关键项:

设置 移动建议 说明
Texture Streaming Pool 512MB 起,看机定 内存池上限
r.Streaming.PoolSize 同上(控制台变量)
mip 纹理尺寸 不必超 2048 手机屏看不见 4096 的细节
纹理组(Texture Group) 按类型分(角色/道具/地表) 各组独立 LOD 偏移

纹理流送"看不见的坑"

坑 1:贴图闪一下才变清晰 —— 流送池太小,切镜头时引擎来不及加载高 mip。解法:加大池子或降低 mip bias 需求。

坑 2:池子爆导致全场景糊 —— 内存紧张时引擎会丢弃高 mip。表现为整屏马赛克。解法:查 stat streaming,看是不是某些 4096 贴图把池子吃光——美术规范移动端最大 1024/2048。

坑 3:流送与烘焙光照贴图冲突 —— Lightmap 也走流送池,大场景烘焙后池子吃紧。解法:r.Streaming.LightingPoolSize 单独设。

我的资产规范(团队级)

导入资产时在编辑器 自动化 script 里强制:

资产类型 最大尺寸 压缩 LOD
角色(主角) 2048 TC_SRGB / DXT 3 级
次要角色/NPC 1024 同上 3 级
道具 512 同上 2 级
地表 splat 1024 TC_Masks -
UI 2048 无压缩(UI 要清晰) -

配套流程:写个 EditorUtilityWidget 扫全库,凡有超尺寸/无 LOD 的资产打报告(扫描脚本怎么写见本系列编辑器工具那本书)。

相关节点速查

  • LOD:静态网格编辑器 -> LOD Settings -> Build(或手动导入各 LOD 级模型)
  • 按平台 LOD:DeviceProfile 里的 r.ForceLOD / LOD Bias
  • 流送池:r.Streaming.PoolSize;查看 stat streaming
  • 纹理组:Texture Group 属性 + 设备描述里 Texture LOD Bias

心得:纹理流送池大小是移动项目最常被"事后发现"的配置。默认值按桌面给,中端机上不是爆池子就是贴图闪。我一般是项目立项第二周就把池子、纹理规范、LOD 规范三件事先定死,后期几乎没有资产返工。