Unityのドローコールを減らすには、まず Statistics・Profiler・Frame Debugger で数を確かめ、使っているレンダーパイプラインに合った方法を選びます。
- 数を見る:Game ビューの Stats、Profiler の Rendering、Frame Debugger
- URP・HDRP:SRP Batcher を有効にし、URP なら GPU Resident Drawer も検討する
- Built-in:静的バッチ(Static Batching)と、マテリアルの GPU インスタンシング
- 共通:同じマテリアルをできるだけ多くのオブジェクトで使い回す
- 動的バッチ(Dynamic Batching)は、公式マニュアルでは多くの場合もう勧めていない
この記事は、Unity 6.3 の公式マニュアル(2026年10月18日に確認)の記載にもとづいています。
画面と数値は、Unity 6.6(6000.6.5f1)と URP 17.6.0 の練習プロジェクトを使い、Windows 11 のエディタで確かめました。
確かめたのは、Statistics・Frame Debugger・Profiler での数え方と、URP の GPU Resident Drawer・SRP Batcher、マテリアルの GPU インスタンシング、静的バッチを切り替えたときの数の変化です。
HDRP と Built-in、ビルドしたアプリでの計測、動的バッチ、自作シェーダーの SRP Batcher への対応、静的バッチによるメモリーの増え方は確かめていません。
画面の名前は英語版の表記です。
ドローコールとは
公式マニュアルでは、初期状態ではメッシュ1つごとに1回のドローコールが必要だと説明されています。
1回のドローコールは、GPU が描くのに必要なシェーダーやテクスチャなどを CPU が準備して送る「描画状態の更新」と、何を描くかを伝える「送信」の2段階に分かれます。
このうち描画状態の更新が、CPU にとって最も重い段階です。
ドローコールを最適化すると、同じ描画状態を使うデータやメッシュがまとめられ、描画状態の更新の回数が減ります。
マニュアルでは、フレーム時間の改善や、1フレームで描けるオブジェクト数の増加、バッテリーで動く機器の発熱と電池の減りの抑制が効果として挙げられています(Unity Manual:Introduction to optimizing draw calls)。
減らす方法は3種類
| 方法 | しくみ | 代表例 |
|---|---|---|
| GPU インスタンシング | 同じメッシュの複製を、GPU の機能で1回のドローコールで描く | マテリアルの Enable GPU Instancing、GPU Resident Drawer |
| 描画状態の更新を減らす | 大きな GPU バッファなどを使い、描画状態の切り替えを減らす | SRP Batcher |
| バッチ | 同じ描画状態を使うメッシュを結合して、まとめて描く | 静的バッチ、動的バッチ |
まずドローコールの数を確かめる
公式マニュアルでは、CPU が GPU に送るドローコールが多すぎる状態(CPU がボトルネックの状態)のときに、ドローコールの最適化を使うよう案内しています。
数を確かめる方法として挙がっているのは、Rendering Statistics の SetPass の値、Profiler の Rendering、Frame Debugger の3つです(Unity Manual:Choose a method for optimizing draw calls)。
Game ビューの Stats で見る
Play モード中に Game ビュー右上の Stats ボタンを押すと、Statistics ウィンドウが Game ビューの右上に重ねて表示されます。
| 項目 | 意味 |
|---|---|
| Batches | 1フレームで処理したドローコールのバッチの合計(静的・動的・インスタンスのバッチを含む) |
| Saved by batching | バッチにまとめられたドローコールの数 |
| SetPass | 1フレームの中で、描画に使うシェーダーのパスを切り替えた回数 |
| CPU(Main・Render) | 1フレームの処理にかかった時間と、描画にかかった時間 |
マニュアルでは、マテリアルが変わると新しいバッチになるため、できるだけ多くのオブジェクトでマテリアルを共有するよう説明されています(Unity Manual:Rendering Statistics window reference)。
表示される項目は、ビルドの対象によって変わります。
Unity 6.6 の Statistics には Batches と Saved by batching の行が無く、Scene の欄に Set Pass Calls と Draw Calls(かっこ内はインスタンスの数)が並んでいました。
Draw Breakdowns を開くと、SRP Batcher・BRG/GRD・Non-SRP Compatible・Standard Instanced ごとのドローコールの数が分かれて表示されます。
どの方法でまとめられたかがここで分かるので、設定を変えたときの比較に使えます。
Profiler の Rendering で見る
Window > Analysis > Profiler で Profiler を開き、Rendering のモジュールを選ぶと、Batches・SetPass Calls・Triangles・Vertices の推移がグラフで表示されます。
下の詳細欄には Draw Calls も表示され、これはバッチされていないドローコールと、動的・静的にバッチされたドローコールを合わせた数です。
詳細欄の左上の Open Frame Debugger から、Frame Debugger を開くこともできます(Unity Manual:Rendering Profiler module reference)。

Unity 6.6 の詳細欄には、SetPass calls・Draw calls・Triangles・Vertices の数と、Dynamic Batching・Static Batching・Instancing ごとの呼び出しとバッチの数が表示されました。
GPU Resident Drawer を使っているときは、その下に GRD coverage(GPU Resident Drawer で描かれたオブジェクトの割合と数)も出ます。
練習では、グラフの Batches Count はどの設定でも0のままだったため、比べるときは SetPass calls と Draw calls を見ました。
また、Play モードの途中で開いた Profiler にはフレームが記録されず、いったん停止して Play モードに入り直すと記録されました。
Frame Debugger で1回ずつ見る
- Window > Analysis > Frame Debugger を開く
- 対象の選択欄を Editor にする(ビルドしたアプリを見るときは、そのプロセスを選ぶ)
- Enable を押すと、そのフレームが取り込まれ、Event Hierarchy にドローコールなどの描画イベントが並ぶ
- イベントを選ぶと、そのイベントまでで描かれた画面と、右側の詳細が表示される
アプリを実行中に Enable を押すと、アプリは一時停止します(Unity Manual:Debug a frame)。
詳細欄には、そのイベントのドローコールの数や、使われたメッシュとシェーダーが表示されます。
Unity 6.6 では、詳細の Details の中の Event Info に、Draw Calls・DrawInstanced Calls・Instances・Batch Break Cause・Meshes が並んでいました。
レンダーパイプライン別の選び方
どの方法を使えるか、どれを勧めるかは、URP・HDRP・Built-in のどれを使っているかで違います。
| 方法 | URP | HDRP | Built-in |
|---|---|---|---|
| SRP Batcher | 有効にする | 有効にする | 使えない |
| GPU Resident Drawer | 有効にする | 有効にする | 使えない |
| マテリアルの GPU Instancing | オフ(余分なシェーダーバリアントを避ける) | オフ(同上) | インスタンスやライトが多ければオン |
| バッチ | オフ(静的バッチは GPU Resident Drawer と併用できない) | オフ(同上) | 静的バッチをオン、動的バッチは勧めない |
使っているレンダーパイプラインが分からない場合や、それぞれの違いは、URP・HDRP・Built-inの違いと選び方で説明しています。
マニュアルでは、すべてを有効にした場合、静的なメッシュは静的バッチ、対応するシェーダーの動くメッシュは SRP Batcher と GPU Resident Drawer、残りは GPU インスタンシング、さらに残りは動的バッチで描く、という順に使い分けると説明されています。
URP・HDRP:SRP Batcherを確かめる
SRP Batcher は、ドローコールの数そのものではなく、ドローコールの間の描画状態の切り替えを減らすしくみです。
マテリアルの内容を GPU のメモリーに置いたままにし、内容が変わらなければ描画状態を変えないことで、CPU の準備の時間を減らします。
マニュアルでは、1つのまとまりにできるだけ多くの描画を入れるため、シェーダーバリアントをできるだけ少なくし、同じシェーダーを使うマテリアルなら数は増やしてよいと説明されています(Unity Manual:Scriptable Render Pipeline Batcher in URP)。
有効にする
- Project ウィンドウで、使っている URP アセットを選ぶ
- Inspector の Rendering の欄で SRP Batcher をオンにする
- 項目が見えない場合は、URP アセットの詳細なプロパティを表示する設定にする
Unity 6.6 では、SRP Batcher の項目は初期状態では表示されず、Rendering の見出しの右端のメニューから Show All Advanced Properties を選ぶと、Store Actions の上に出てきました。
練習に使った Universal 3D テンプレートのプロジェクトでは、PC 用の URP アセット(PC_RPAsset)で SRP Batcher が最初からオンでした。

マニュアルには、SRP Batcher に合わせて作られていないアセットやシェーダーが多いプロジェクトでは、性能の低い機器ではオフのほうが速いことがあるとも書かれています。
対象になるオブジェクトとシェーダー
- メッシュかスキンメッシュを持つオブジェクトであること(パーティクルは対象外)
- MaterialPropertyBlock を使っていないこと
- シェーダーが SRP Batcher に対応していること(URP・HDRP の Lit・Unlit は対応、パーティクル用は除く)
- 自作のシェーダーは、組み込みのプロパティを UnityPerDraw、マテリアルのプロパティを UnityPerMaterial という1つの定数バッファーにまとめて宣言する
シェーダーが対応しているかどうかは、そのシェーダーの Inspector で確かめられます。
まとまらない理由を Frame Debugger で見る
- Frame Debugger を開いて Enable を押す
- ExecuteRenderGraph の中の DrawOpaqueObjects を開く
- RenderLoop.DrawSRPBatcher を開き、調べたい SRP Batch を選ぶ
手順2と3の名前は Unity 6.6 の URP で表示されたものです。
公式マニュアルでは Render Camera の中の Render Opaques、RenderLoopNewBatcher の Draw という名前で説明されています。
詳細欄の Batch cause(Unity 6.6 では Batch Break Cause)に、1つ前のまとまりと一緒にできなかった理由が表示されます。
マニュアルの例では、理由が Nodes have different shaders(前と違うシェーダーを使っている)となっています。
練習では、GPU Resident Drawer を Disabled にして SRP Batcher だけを使うと、同じ Lit シェーダーで色違いのマテリアル4つを割り当てた立方体400個が、SRP Batch 2つ(それぞれ Draw Calls 200)にまとまりました。
2つとも Batch Break Cause は SRP: First call from ScriptableRenderLoopJob で、マテリアルの違いは理由になっていませんでした。

描画の数が少ない SRP Batch がいくつもある場合は、シェーダーバリアントが多すぎることがよくあると説明されています(Unity Manual:Troubleshoot the SRP Batcher in URP)。
URPのGPU Resident Drawer
GPU Resident Drawer は、BatchRendererGroup API を使ってオブジェクトを GPU インスタンシングで自動的に描き、ドローコールを減らす機能です。
- Project Settings > Graphics の Shader Stripping で、BatchRendererGroup Variants を Keep All にする
- 使っている URP アセットで、SRP Batcher がオンになっているのを確かめる
- 同じ URP アセットで、GPU Resident Drawer を Instanced Drawing にする
- Renderer List のレンダラーを開き、Rendering Path を Forward+ にする
使えるのは、Forward+ のレンダリングパスで、コンピュートシェーダーに対応したグラフィックス API(OpenGL ES を除く)の環境と、Mesh Renderer を持つオブジェクトです。
条件に合わない場合、Unity は GPU インスタンシングを使わずに描きます。
有効にすると、BatchRendererGroup 用のシェーダーバリアントをすべてビルドに入れるため、ビルドの時間が長くなります。
Frame Debugger では、GPU Resident Drawer でまとめられた描画が Hybrid Batch Group という名前で表示されます(Unity Manual:Enable the GPU Resident Drawer in URP)。
練習に使った Universal 3D テンプレートのプロジェクトでは、PC_RPAsset の GPU Resident Drawer が最初から Instanced Drawing でした。
その下には、GPU で描画を送る方式では静的バッチを勧めないという注意(Static Batching is not recommended when using GPU draw submission modes)が表示されました。
この状態で再生すると、立方体400個が DrawOpaqueObjects の中の Hybrid Batch Group 1つ(DrawInstanced Calls 4、Instances 400)にまとまりました。

手順1の BatchRendererGroup Variants と手順4の Rendering Path は、画面では確かめていません。
マニュアルでは、シーンが大きく、同じメッシュを使うオブジェクトが多いほど効果が出やすいと説明されています。
Built-in:静的バッチとGPUインスタンシング
動かないオブジェクトは静的バッチ
静的バッチは、動かない複数のメッシュをワールド座標で1つの頂点バッファーとインデックスバッファーにまとめる方法です。
- Edit > Project Settings > Player を開く
- Other Settings で Static Batching をオンにする
- まとめたいオブジェクトを選び、Inspector の Static Editor Flags で Batching Static をオンにする
Unity 6.6 では、Inspector 右上の Static の横の▼から Batching Static を選べました。
子を持つオブジェクトで選ぶと、子にも同じ設定をするかを聞く確認(Change Static Flags)が出ます。
静的バッチは URP の練習プロジェクトで、SRP Batcher と GPU Resident Drawer をオフにして試しており、Built-in では確かめていません。
ビルド時にまとめておけば、実行中に CPU を使ってまとめる処理は発生しません。
その代わり、同じメッシュでも結合したメッシュを保存するために追加のメモリーを使い、木を大量に並べた森のような場面ではメモリーへの影響が大きくなります(Unity Manual:Batch static meshes at build time)。
メモリーを使いすぎる場合は、メッシュを手で結合する方法がマニュアルで案内されています。
同じメッシュが多いならGPUインスタンシング
GPU インスタンシングは、同じメッシュと同じマテリアルを使う複数のオブジェクトを、1回のドローコールで描く方法です。
木や草むらのように、同じものがシーンに何度も出てくる場合に向いています。
- Project ウィンドウでマテリアルを選ぶ
- Inspector の Advanced Options で Enable GPU Instancing をオンにする
- Frame Debugger で Draw Mesh (Instanced) という描画があるかを確かめる
Enable GPU Instancing の項目が無いシェーダーは、GPU インスタンシングに対応していません。
URP・HDRP では、GPU インスタンシングは SRP Batcher をオフにした場合にしか働かず、SRP Batcher を使うのが推奨とされています(Unity Manual:Enable GPU instancing for a prebuilt material)。
練習では URP で SRP Batcher と GPU Resident Drawer をオフにし、4つのマテリアルをまとめて選んで Enable GPU Instancing をオンにしました。
Frame Debugger の DrawOpaqueObjects の中に Draw Mesh (Instanced) が9つ並び、Batch Break Cause は Objects have different materials. でした。
SRP Batcher をオンにしたままインスタンシングをオンにした場合は、確かめていません。
効果は機種と GPU によって違い、マニュアルではデスクトップよりモバイルのほうが効果が出やすいと説明されています。
動的バッチは勧められていない
動くオブジェクトをまとめる動的バッチは、CPU の負担がドローコールの負担より大きくなることがあるため、公式マニュアルでは多くの場合もう勧めていません。
勧めているのは性能の低い機器に限られ、HDRP では使えず、300頂点を超えるメッシュはまとめられないといった制限もあります(Unity Manual:Introduction to batching meshes)。
どの方法でも効くこと
- 同じマテリアルを、できるだけ多くのオブジェクトで使い回す
- 色だけ違う同じメッシュを描くなら、マテリアルを複数作らず Material Variants を使う
- URP・HDRP では MaterialPropertyBlock の使用を避ける
- テクスチャだけが違う2つのマテリアルは、テクスチャを1枚の大きなテクスチャにまとめる
2D の Sprite や UI の画像を1枚にまとめる手順は、Sprite Atlasの作り方で説明しています。
バッチされないときに確かめること
バッチされているかどうかは、Frame Debugger に Draw Static または Draw Dynamic という描画があるか、詳細の Meshes 欄に Combined Mesh があるかで確かめます。
Unity 6.6 の URP で静的バッチを試したところ、Frame Debugger のイベント名は Static Batch で、詳細の Mesh にはメッシュ名が出ず、Combined Mesh の表示は確かめられませんでした。
バッチされていない場合は、オブジェクトごとに次の点を確かめます。
- オブジェクトが有効になっている
- Mesh Renderer が有効になっている
- Mesh Renderer のマテリアルが、DisableBatching を True にしたシェーダーを使っていない
- Mesh Filter が有効で、メッシュが入っている
- メッシュの頂点が0より多く、すでに別のメッシュと結合されていない
- メッシュの頂点属性の構成が同じ(UV があるメッシュと無いメッシュはまとめられない)
静的バッチを使う場合は、メッシュ・シェーダーバリアント・テクスチャのサンプラー・ライトマップ・レイヤーが同じであること、メッシュが小さすぎないこと、LOD のフェードを使っていないことも確かめます(Unity Manual:Set up GameObjects for batching)。
バッチは Mesh Renderer だけが対象で、Skinned Mesh Renderer には使えず、半透明のオブジェクトは奥から手前に並べ替えてからまとめるため、まとまりにくいことがあります。
練習シーンで数を比べた結果
同じシーンで設定だけを変え、Play モードに入ってから約3秒後の Statistics の値を比べました。
シーンは、URP の Lit シェーダーで色違いのマテリアル4つを順に割り当てた立方体400個と、影を出さない平行光源1つです。
| 設定 | Set Pass Calls | Draw Calls(Draw Breakdowns の内訳) |
|---|---|---|
| ① 初期値(GPU Resident Drawer:Instanced Drawing、SRP Batcher:オン) | 8 | 14(BRG/GRD 8) |
| ② ①から GPU Resident Drawer を Disabled | 10 | 806(SRP Batcher 800) |
| ③ ②から SRP Batcher をオフ | 24 | 806(Non-SRP Compatible 800) |
| ④ ③で4つのマテリアルの Enable GPU Instancing をオン | 24 | 24(Standard Instanced 18、インスタンス800) |
| ⑤ ③で立方体を Batching Static に | 24 | 86(Non-SRP Compatible 80) |
| ⑥ ③で全部の立方体を1つのマテリアルに | 10 | 806(Non-SRP Compatible 800) |

同じ数を、エディタ拡張で読んだ値と、ProfilerRecorder で SetPass Calls Count と Draw Calls Count を60フレーム平均した値でも記録し、Statistics の表示とほぼ一致しました。
立方体400個に対してインスタンスが800になるのは、Frame Debugger で見ると、深度の事前パス(DrawDepthNormalPrepass)と不透明の描画(DrawOpaqueObjects)で2回ずつ描かれていたためです。
SRP Batcher は Draw Calls の806を変えず、Set Pass Calls を24から10に減らしました。
GPU Resident Drawer を使うと、Draw Calls そのものが806から14に減りました。
SRP Batcher をオフにした状態では、GPU インスタンシングで Draw Calls が24に、静的バッチで86に減りました。
マテリアルを1つにまとめると、SRP Batcher がオフでも Set Pass Calls は24から10に減り、Draw Calls は変わりませんでした。
FPS やフレーム時間はエディタのほかの処理の影響で毎回ぶれたため、表には載せていません。
ビルドしたアプリや、もっと大きなシーンでの効果は測っていません。
減らした後に確かめること
- 変更の前後で、Stats の Batches(Unity 6.6 では Draw Calls)・SetPass と CPU の時間を比べた
- バッチをオンにした場合とオフにした場合の両方で、性能を測った
- Frame Debugger で、狙った方法の描画(SRP Batch・Draw Static・Draw Mesh (Instanced)・Hybrid Batch Group)が出ている
- 静的バッチを使った場合、メモリーの使用量が増えすぎていない
- エディタだけでなく、Play モードやビルドしたアプリでも測った
マニュアルでは、GPU Resident Drawer の効果は Scene ビューや Game ビューでは、Play モードや最終的なビルドより小さく出ることが多いと説明されています。
Frame Debugger は毎フレーム更新されるため、ドローコールの数が速く変わる場面では一覧が読みにくくなることがあります。
