SuperAPI AI 工具集

blender-game-optimization

设计与创作

查看项目

更新于 10-16 19:37

技能介绍

用途

该技能用于将 Blender 资产优化到符合实时引擎的运行时预算,面向手机、Roblox、Web、VR、主机与 PC 等平台。执行模型位于 blender-core,优化完成后必须重新运行 blender-asset-qa。

主要能力

  • 按平台预算测量资产:脚本 scripts/mesh_stats.py -- --objects ... --budget mobile|roblox|web|vr|console|pc,返回三角面数、预估 draw call、材质数、贴图显存、骨骼数与超预算项。
  • 生成 LOD 链:scripts/make_lods.py -- --objects SM_X --rename 会创建 _LOD1 至 _LOD3,分别保留 50/25/12.5% 的三角面。
  • 清理几何:make_lods.py --cleanup 执行按距离 0.1 mm 合并、退化元素消除、孤立元素删除;另外可移除隐藏面,包括背靠背面与其他部件下方的面(可通过 qa_check 的 back_to_back 与手动 X 光检查)。
  • 材质合并:将每个资产合并到 1–2 个材质(可用图集、trim sheet 或共享平铺材质),每个网格的材质槽大致对应一次 draw call。
  • 减面按顺序进行(视觉损失最小优先):隐藏/内部几何 → 平面区域不必要的边环(Limited Dissolve 1–5°)→ 过度分段的圆柱 → Decimate → 把细节烘焙到法线(blender-texture-baking)。
  • 优化后重新测量、QA,再导出(blender-export-pipelines)。

各平台预算(2026 年指南,按单资产)

  • Mobile:英雄角色 5–15k 三角面,道具 0.3–3k,材质 1–2,最大贴图 1024,骨骼 ≤75。
  • Roblox:身体 ≤10,742(头 4k、躯干 1.75k、四肢 1,248);配饰/服装 4k;每个 MeshPart ≤20k;材质 1(SurfaceAppearance);贴图 1024(PBR),最大 4k;R15 加可选骨骼。
  • Web(three.js/Babylon):英雄角色 10–30k,道具 1–10k,材质 1–2,最大贴图 2048,骨骼 ≤100。
  • Standalone VR(Quest):英雄角色 10–40k,道具 1–10k,材质 1–3,最大贴图 2048,骨骼 ≤100。
  • Console / PC:英雄角色 50–150k,道具 5–50k,材质 2–6,最大贴图 4096,骨骼 150–300。
  • UE5 Nanite(静态):道具可达数百万,材质少,贴图 4096+,骨骼不适用。

整场景限制比单资产更重要:移动端约可见 100–300k 三角面且低于 100–200 次 draw call;PC 约数百万三角面且低于 2–5k 次 draw call。

减面模式

  • COLLAPSE(按比例):适合有机体、扫描、LOD;可用 use_symmetry、顶点组系数保护面部/手部;会三角化。
  • UNSUBDIV(按迭代次数):适合由细分四边形制作的网格,能干净地还原四边形网格。
  • DISSOLVE(平面,按角度):适合硬表面/CAD;可限定 {"SEAM","SHARP","MATERIAL","UV"};保留轮廓但产生 n-gon,导出时需三角化。

保护 UV 接缝与轮廓:对副本减面后比较。如果 LOD1 处 UV 撕裂,说明该拓扑的比例过于激进,需重新展开或使用手动 LOD。

隐藏成本:顶点分裂

GPU 顶点数等于唯一(position、normal、UV、color)组合数。每个 UV 接缝与硬边都会复制顶点,因此引擎顶点数常是 Blender 的 1.5–3 倍。应尽量减少不必要的接缝,让硬边与接缝重合(只分裂一次),并且不要添加未使用的顶点色或额外 UV 集。

LOD 规则

  • 每级三角面减半。在屏幕尺寸约 0.5 / 0.25 / 0.125 处切换(UE“Screen Size”、Unity LOD Group 百分比、Godot lod_bias auto)。
  • LOD 保持相同材质(或更少:在 LOD2+ 合并),相同轴心,相同包围盒。
  • 骨骼 LOD:在 LOD2+ 移除手指/面部骨骼(引擎的骨骼缩减工具可处理)。保持同一骨架上的蒙皮。
  • 远景 LOD / 植被:用 impostor/billboard。Unreal Nanite(静态、不透明/遮罩)与 Godot 的自动网格 LOD 可替代手工 LOD 链。
  • Roblox:无手动 LOD,RenderFidelity=Automatic 会处理。每个 MeshPart ≤20k 三角面,对不可行走部件使用简单 CollisionFidelity(Box/Hull)。

Draw call 与批处理

  • 合并共享材质且总是同时可见的静态网格(join objects)。不要跨大面积合并,否则会破坏视锥/遮挡剔除。
  • 实例化:重复对象作为链接副本(Alt+D,共享网格)或集合实例。它们导出为实例(glTF EXT_mesh_gpu_instancing,配合 export_gpu_instances)或在引擎中作为一个网格加变换。
  • 图集/trim sheet:把许多道具放在一套贴图上。Trim sheet 可让墙壁、面板与管道共享一个 2k 材质。
  • 贴图显存(未压缩 RGBA8 + mips 的上限):1k = 5.3 MB,2k = 21 MB,4k = 85 MB。引擎会压缩(BC7/ASTC 约 4–8 倍)。将灰度图打包到 ORM 通道可将其减少 3 倍。

碰撞

保持碰撞独立且简单:盒体/凸包不超过 32–255 个顶点。UE 用 UCX_<Mesh>_##,Godot 用 -colonly/-convcolonly 后缀,Unity 在简化网格上使用 MeshCollider,Roblox 用 CollisionFidelity。任何会移动的物体都不要把渲染网格用作物理网格。

骨骼与动画成本

每个顶点限制为 4 个影响(vertex_group_limit_total(limit=4) 并归一化)。导出时移除非变形骨骼(use_armature_deform_only)。将约束与驱动烘焙为关键帧。形态键按顶点消耗内存,因此删除未使用的键并只保留增量(glTF 稀疏访问器可处理)。

常见陷阱

  • 带未应用修改器的网格上减面:make_lods.py 会先评估它们。其他路径需要你先应用。
  • Join(Ctrl+J)按名称合并材质与 UV 贴图。先统一重命名 UV 贴图,否则 UV 会丢失。
  • Weld 修改器是非破坏性的按距离合并。使用 mode="CONNECTED" 避免焊接分离部件。
  • 如果引擎会三角化,测量前先三角化。四边形在统计中已经按 2 个三角面计算。