在运行 Unreal Engine 5 场景时,左上角偶尔会出现类似以下的黄色警告:
[VSM] Non-nanite Marking Job Queue overflow. Performance may be affected. This occurs when non-nanite meshes cover a large area of the shadow map.
这通常是在启用了 Virtual Shadow Maps (VSM) 且场景中存在大量 非 Nanite 静态网格(Static Mesh)时触发的。以下内容将分四大部分,逐步分析原因并给出多种可选的解决方案。
1. 原因分析
1.1 Virtual Shadow Maps 与 Nanite 的耦合
VSM 设计时主要针对 Nanite 网格进行高效裁剪与渲染,能利用 Nanite 的虚拟化几何优势,避免不必要的页面(Page)分配与渲染开销。
对于 非 Nanite 网格,VSM 会退回到更昂贵的 Distance Field Shadows 或常规 Shadow Maps,导致大量小页面同时被请求,最终触发“队列溢出”警告。
1.2 场景中非 Nanite 网格覆盖范围过大
当非 Nanite 静态网格在 Shadow Map 中占据很大区域时,VSM 必须为每个小块(128×128 像素)都分配渲染任务,触发队列溢出。
例如,即使只是 50 个盒刷(Box Brush),在同一方向光下也可能出现此问题。
该警告同样在其他社区中多次被提及,包括 Archviz Facebook 群组。
2. 解决方案一:全面启用 Nanite
在 Static Mesh 资产中启用 Nanite
打开每个受影响的 Static Mesh 资源,勾选 Enable Nanite Support。
这样可让这些网格在 VSM 中享受 Nanite 的高效页面管理,从根本上消除非 Nanite 网格带来的溢出。
批量操作
若资产数量庞大,可使用批量编辑工具或脚本,一次性为所有符合条件的网格开启 Nanite。
3. 解决方案二:关闭/切换 Shadow Map 方法
在项目设置中切换回常规 Shadow Maps
打开 Project Settings → Engine → Rendering → Shadows
将 Shadow Map Method 从 “Virtual Shadow Maps” 改为 “Shadow Maps”。
该操作会使所有阴影计算退回到传统的级联 Shadow Maps(CSM),彻底避免 VSM 溢出。
运行时使用控制台变量
在控制台或脚本中执行:
pgsql
复制编辑
r.Shadow.Virtual.Enable 0
动态禁用 VSM,恢复到常规阴影模式。
4. 解决方案三:优化非 Nanite 网格
为非 Nanite 网格设置完整 LOD
确保所有非 Nanite 资源均有合理的 LOD 层级,减少远处渲染时的面数。
利用 Distance Field Shadows
对于远距离非 Nanite 对象,可在 Directional Light 上设置 “Dynamic Shadow Distance Movable Light” 使其切换到距离场阴影,从而减轻 VSM 负担。
调整裁剪阈值
使用控制台变量:
php-template
复制编辑
r.Shadow.RadiusThreshold <值>
控制哪些小物体参与 VSM 渲染,避免无意义的小实例大量填充队列。
合并与实例化
对大量重复物体(如植被)使用 Hierarchical Instanced Static Mesh(HISM),大幅降低网格数量和渲染调用。
5. 何时可以忽略该警告
若场景在打包后性能稳定(如 90FPS 以上),且团队不打算深入 VSM 优化,可先忽略该警告,转为关注其他性能瓶颈。
通过以上多种手段,可根据项目需求灵活选择:
追求高质量阴影 → 全面启用 Nanite;
追求传统 Shadow Maps 兼容性 → 关闭 VSM;
兼顾场景复杂度 → 优化非 Nanite 网格与批量实例化。