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. 04LOD の自動生成と確認
  5. 05頂点・テクスチャ・コリジョン・リグのコスト指針
  6. 06最適化後のアセット QA

活用シーン

  1. 01モバイルまたは PC の予算に照らしたアセット確認
  2. 02ジオメトリとマテリアルのコスト削減
  3. 03LOD チェーンの作成と確認
  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 を実行します。三角形数、推定ドローコール数、マテリアル数、テクスチャのVRAM使用量、ボーン数、予算超過項目が表示されます。
  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 個に統合します(アトラス/トリムシート/共有タイリングマテリアル)。メッシュごとのマテリアルスロットは、概ね 1 ドローコールに相当します。
  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
Robloxbody ≤10,742(head 4k、torso 1.75k、limb 1,248);アクセサリー/衣服 4kMeshPart あたり ≤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(比率)有機的なモデル、スキャン、LODuse_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つとして数えられています。

コメント