mcpField
B
blender-game-optimization

blender-game-optimization

github.com/el4cteo创意与媒体569116 次安装2 周前更新
代码仓库

关于 blender-game-optimization

面向为目标平台准备资产的艺术家与技术团队,介绍 Blender 游戏优化方法。内容涵盖测量、几何体与材质精简、LOD 创建,以及导出前的优化检查。

主要功能

  1. 01按平台预算统计网格数据
  2. 02几何体清理与精简顺序
  3. 03材质合并与绘制调用指导
  4. 04自动生成并检查 LOD
  5. 05顶点、纹理、碰撞与绑定成本指南
  6. 06优化后的资产质量检查

适用场景

  1. 01检查资产是否符合移动端或 PC 预算
  2. 02降低几何体与材质成本
  3. 03创建并检查 LOD 链
  4. 04准备优化后的资产以供导出

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/el4cteo/blender-skills --skill blender-game-optimization

安装后在 Claude Code 中输入/blender-game-optimization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

scripts/
_bpyx.py
make_lods.py
mesh_stats.py

详细介绍

游戏优化

执行模型位于 blender-core。优化后务必重新运行 blender-asset-qa。

流程

  1. 测量:运行 scripts/mesh_stats.py -- --objects ... --budget mobile|roblox|web|vr|console|pc。它会返回三角面数、估算的绘制调用数、材质数、纹理显存、骨骼数以及超出预算的项目。
  2. 清理:运行 make_lods.py --cleanup(按 0.1 mm 距离合并、溶解退化几何、删除松散几何)。移除隐藏面:背靠背的面和位于其他部件下方的面(使用 qa_check → back_to_back,并手动检查 X 射线视图)。
  3. 按以下顺序减少(视觉损失从低到高):隐藏/内部几何 → 平坦区域中不必要的边环(Limited Dissolve 1–5°)→ 过度细分的圆柱体 → Decimate → 将细节烘焙到法线贴图(blender-texture-baking)。
  4. 材质:将每个资产的材质合并为 1–2 个(图集/Trim Sheet/共享平铺材质)。每个网格的每个材质槽大致对应一次绘制调用。
  5. LOD:scripts/make_lods.py -- --objects SM_X --rename 会按 50/25/12.5% 生成 _LOD1.._LOD3。使用 look/review_shots 检查每个 LOD 的轮廓。
  6. 重新测量,然后进行 QA,最后导出(blender-export-pipelines)。

预算(2026 年每个资产的参考值)

平台主角三角面数道具三角面数每个资产的材质数最大纹理尺寸骨骼数
移动端5–15k0.3–3k1–21024≤75
Roblox身体 ≤10,742(头部 4k、躯干 1.75k、四肢 1,248);配饰/服装 4k每个 MeshPart ≤20k1 (SurfaceAppearance)1024(PBR),最大 4kR15 + 可选
Web (three.js/Babylon)10–30k1–10k1–22048≤100
独立 VR (Quest)10–40k1–10k1–32048≤100
主机/PC50–150k5–50k2–64096150–300
UE5 Nanite(静态)—数百万也没问题少量4096+不适用
整场景的限制比单个资产更重要:移动端可见三角面约 100–300k,绘制调用数 <100–200;PC 可达数百万个三角面,绘制调用数 <2–5k。

Decimate 模式

模式用途说明
COLLAPSE(比例)有机模型、扫描模型、LOD使用 use_symmetry 和顶点组因子保护面部/手部;会三角化
UNSUBDIV(迭代次数)通过细分四边形生成的网格干净地还原四边形网格
DISSOLVE(平面、角度)硬表面/CAD限定 {"SEAM","SHARP","MATERIAL","UV"};保留轮廓,会生成 n-gon → 导出时三角化
保护 UV 接缝和轮廓:先简化副本,再进行比较。如果 LOD1 的 UV 撕裂,说明该比例对这种拓扑而言过于激进,因此应重新展开 UV 或使用手动制作的 LOD。

隐藏的开销:顶点拆分

GPU 顶点数 = 唯一的(位置、法线、UV、颜色)组合数。每条 UV 接缝和硬边都会复制顶点,因此引擎中的顶点数通常是 Blender 中的 1.5–3 倍。尽量减少不必要的接缝,将硬边与接缝保持一致(这样只会拆分一次),不要添加未使用的顶点颜色或额外 UV 集。

LOD 规则

  • 每级将三角面数减半。当屏幕尺寸约为 0.5 / 0.25 / 0.125 时切换(UE“Screen Size”、Unity LOD Group %、Godot lod_bias 自动调整)。
  • LOD 使用相同材质(或更少材质:从 LOD2 起合并材质)、相同枢轴和相同边界。
  • 骨骼 LOD:从 LOD2 起移除手指/面部骨骼(使用引擎的骨骼精简工具处理)。蒙皮仍使用同一骨架。
  • 远景 LOD/植被:使用 impostor/billboard。Unreal Nanite(静态、不透明/遮罩)和 Godot 的自动网格 LOD 可以取代手工制作的 LOD 链。
  • Roblox:不使用手动 LOD。由 RenderFidelity=Automatic 自动处理。每个 MeshPart 保持 ≤20k 个三角面,并为不可行走部件使用简单的 CollisionFidelity(Box/Hull)。

绘制调用与批处理

  • 合并共享材质且总是同时出现的静态网格(连接对象)。不要跨越大范围进行合并,否则会破坏视锥体剔除/遮挡剔除。
  • 实例化:将重复对象设为链接副本(Alt+D,共享网格)或集合实例。它们会导出为实例(glTF EXT_mesh_gpu_instancing,使用 export_gpu_instances),或在引擎中导出为一个网格加变换。
  • 图集/修剪表:将许多道具放到一组纹理上。修剪表可让墙壁、面板和管道共用一套 2k 材质。
  • 纹理内存(未压缩 RGBA8 加 mipmap 的上限):1k = 5.3 MB,2k = 21 MB,4k = 85 MB。引擎会进行压缩(BC7/ASTC ≈ 4–8×)。将灰度贴图打包到 ORM 通道,可将占用减少至 1/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 稀疏访问器可处理这一点)。

注意事项

  • 对未应用修改器的网格执行 Decimate:make_lods.py 会先计算修改器。其他流程则需要你先应用修改器。
  • Join(Ctrl+J)会按名称合并材质和 UV 贴图。请先将 UV 贴图重命名为相同名称,否则 UV 会丢失。
  • Weld 修改器是按距离进行非破坏性合并的方式。使用 mode="CONNECTED" 可避免焊接独立部件。
  • 如果引擎会进行三角化,请在测量前先进行三角化。统计信息中四边形已按 2 个三角形计算。

评论

支持 Markdown