关于 blender-game-optimization
面向为目标平台准备资产的艺术家与技术团队,介绍 Blender 游戏优化方法。内容涵盖测量、几何体与材质精简、LOD 创建,以及导出前的优化检查。
主要功能
- 01按平台预算统计网格数据
- 02几何体清理与精简顺序
- 03材质合并与绘制调用指导
- 04自动生成并检查 LOD
- 05顶点、纹理、碰撞与绑定成本指南
- 06优化后的资产质量检查
适用场景
- 01检查资产是否符合移动端或 PC 预算
- 02降低几何体与材质成本
- 03创建并检查 LOD 链
- 04准备优化后的资产以供导出
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-game-optimization安装后在 Claude Code 中输入/blender-game-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/_bpyx.pymake_lods.pymesh_stats.py详细介绍
游戏优化
执行模型位于 blender-core。优化后务必重新运行 blender-asset-qa。
流程
- 测量:运行
scripts/mesh_stats.py -- --objects ... --budget mobile|roblox|web|vr|console|pc。它会返回三角面数、估算的绘制调用数、材质数、纹理显存、骨骼数以及超出预算的项目。 - 清理:运行
make_lods.py --cleanup(按 0.1 mm 距离合并、溶解退化几何、删除松散几何)。移除隐藏面:背靠背的面和位于其他部件下方的面(使用qa_check→back_to_back,并手动检查 X 射线视图)。 - 按以下顺序减少(视觉损失从低到高):隐藏/内部几何 → 平坦区域中不必要的边环(Limited Dissolve 1–5°)→ 过度细分的圆柱体 → Decimate → 将细节烘焙到法线贴图(
blender-texture-baking)。 - 材质:将每个资产的材质合并为 1–2 个(图集/Trim Sheet/共享平铺材质)。每个网格的每个材质槽大致对应一次绘制调用。
- LOD:
scripts/make_lods.py -- --objects SM_X --rename会按 50/25/12.5% 生成_LOD1.._LOD3。使用look/review_shots检查每个 LOD 的轮廓。 - 重新测量,然后进行 QA,最后导出(
blender-export-pipelines)。
预算(2026 年每个资产的参考值)
| 平台 | 主角三角面数 | 道具三角面数 | 每个资产的材质数 | 最大纹理尺寸 | 骨骼数 |
|---|---|---|---|---|---|
| 移动端 | 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 |
| 独立 VR (Quest) | 10–40k | 1–10k | 1–3 | 2048 | ≤100 |
| 主机/PC | 50–150k | 5–50k | 2–6 | 4096 | 150–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