blender-game-optimization について
対象プラットフォーム向けにアセットを準備するアーティストや技術チーム向けの、Blender ゲーム最適化スキルです。計測、ジオメトリとマテリアルの削減、LOD 作成、書き出し前の最適化チェックを説明します。
主な機能
- 01プラットフォーム予算に基づくメッシュ統計
- 02ジオメトリの整理と削減手順
- 03マテリアル統合とドローコールの指針
- 04LOD の自動生成と確認
- 05頂点・テクスチャ・コリジョン・リグのコスト指針
- 06最適化後のアセット QA
活用シーン
- 01モバイルまたは PC の予算に照らしたアセット確認
- 02ジオメトリとマテリアルのコスト削減
- 03LOD チェーンの作成と確認
- 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を実行します。三角形数、推定ドローコール数、マテリアル数、テクスチャのVRAM使用量、ボーン数、予算超過項目が表示されます。 - クリーンアップ:
make_lods.py --cleanup(距離 0.1 mm で統合、縮退要素を溶解、孤立要素を削除)を実行します。非表示の面を削除します。背中合わせの面や他のパーツの下にある面が対象です(qa_check→back_to_backに加えて、手動で X 線表示を確認)。 - 次の順序で削減(見た目への影響が小さいものから):非表示/内部ジオメトリ → 平面部分の不要なエッジループ(Limited Dissolve 1~5°)→ 分割数が多すぎる円柱 → Decimate → ディテールを法線にベイク(
blender-texture-baking)。 - マテリアル:アセットあたり 1~2 個に統合します(アトラス/トリムシート/共有タイリングマテリアル)。メッシュごとのマテリアルスロットは、概ね 1 ドローコールに相当します。
- 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 | body ≤10,742(head 4k、torso 1.75k、limb 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 ゴンを作成します → エクスポート時に三角形化します |
| UV シームとシルエットを保護してください。コピーを Decimate してから比較します。LOD1 で UV が破綻する場合、そのトポロジーには比率が過剰です。再アンラップするか、手動で LOD を作成してください。 |
見落としがちなコスト:頂点の分割
GPU の頂点数 = 一意な(位置、法線、UV、色)の組み合わせの数です。UV シームとハードエッジごとに頂点が複製されるため、エンジン内の頂点数は Blender の 1.5~3 倍になることがよくあります。不要なシームを最小限にし、ハードエッジはシームと一致させて分割が 1 回で済むようにします。また、使わない頂点カラーや追加 UV セットは追加しないでください。
LOD のルール
- レベルごとに三角形数を半減させます。画面サイズが約 0.5/0.25/0.125 になったら切り替えます(UE の「Screen Size」、Unity の LOD Group の%、Godot の
lod_biasによる自動切り替え)。 - LOD では同じマテリアルを使用します(または LOD2 以降ではマテリアル数を減らして統合します)。ピボットと境界も同じにします。
- スケルタル LOD:LOD2 以降では指/顔のボーンを削除します(この処理にはエンジンのボーン削減ツールを使用します)。スキニングには同じスケルトンを使用します。
- 遠景 LOD/植生:インポスター/ビルボードを使用します。Unreal Nanite(静的、不透明/マスク)や Godot の自動メッシュ LOD を使えば、手作業で LOD チェーンを作成する必要がなくなります。
- Roblox:手動の LOD は使用しません。
RenderFidelity=Automaticが自動で処理します。各 MeshPart を ≤20k 三角形に保ち、歩行できないパーツにはシンプルなCollisionFidelity(Box/Hull)を使用します。
ドローコールとバッチング
- 同じマテリアルを共有し、常に一緒に表示される静的メッシュは結合します(オブジェクトを結合)。大きな領域をまたいで結合しないでください。フラスタムカリング/オクルージョンカリングの効果が失われます。
- インスタンシング:リンク複製(Alt+D、メッシュを共有)またはコレクションインスタンスとして、オブジェクトを繰り返し配置します。インスタンスとしてエクスポートする(glTF
EXT_mesh_gpu_instancingとexport_gpu_instancesを使用する)か、エンジン内で1つのメッシュとトランスフォームとして扱います。 - アトラス/トリムシート:多数のプロップを1つのテクスチャセットにまとめます。トリムシートを使うと、壁、パネル、パイプで1つの2kマテリアルを共有できます。
- テクスチャメモリ(上限値、非圧縮 RGBA8+ミップマップ):1k=5.3 MB、2k=21 MB、4k=85 MB。エンジンでは圧縮されます(BC7/ASTC ≈ 4~8 倍)。グレースケールマップを ORM チャンネルに格納すると、使用量を3分の1に削減できます。
コリジョン
コリジョンは分離し、シンプルに保ちます。頂点数が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が先に評価します。それ以外の方法では、モディファイアーを適用する必要があります。 - 結合(
Ctrl+J)すると、マテリアルと UV マップは名前でマージされます。先に UV マップの名前を同じにしないと、UV が失われます。 Weldモディファイアーは、距離に基づく非破壊的なマージです。別々のパーツが結合されないように、mode="CONNECTED"を使います。- エンジン側で三角形化される場合は、計測前に三角形化します。統計では、四角形はすでに三角形2つとして数えられています。