【Unity】レンダリング最適化!ドローコールとバッチングを理解して描画を高速化する

作成: 2025-12-07

なぜオブジェクトを増やすと重くなるのか?その鍵は「ドローコール」にあります。ドローコールとは何か、そしてそれを削減するための強力なテクニック「バッチング」の仕組みを、海外のベストプラクティスを交えて解説します。

概要

Unityで美しいシーンを作成しようとすると、たくさんのオブジェクトやマテリアルを配置したくなります。しかし、オブジェクトの数が増えるにつれて、フレームレートが低下していくのを経験したことがあるでしょう。この描画パフォーマンスの低下の裏側には、ドローコール (Draw Call) という概念が深く関わっています。

ドローコールは、CPUからGPU(グラフィックスカード)に対して「このオブジェクトを、このマテリアルで、この場所に描画してください」と指示を出す命令のことです。オブジェクトが一つ描画されるたびに、基本的にドローコールが1回発生します。そして、この命令の発行自体がCPUにとってかなりの負荷となるため、ドローコールの回数が多すぎると、GPUが遊んでいるにも関わらずCPUがボトルネックとなり、パフォーマンスが頭打ちになってしまうのです。

この記事では、このドローコールとは何か、そしてUnityがドローコールを削減するために提供している強力な自動最適化技術であるバッチング (Batching) の仕組みについて、詳しく解説していきます。

ドローコールとは?

CPUがGPUに描画を命令するプロセスは、単に「これを描いて」と伝えるほど単純ではありません。実際には、以下のような一連の準備と命令が必要です。

  1. レンダリングステートの設定: どのシェーダーを使うか、どのテクスチャをバインドするか、ライティングやブレンドモードはどうするか、といったGPUの状態を細かく設定します。
  2. メッシュデータの転送: 描画するオブジェクトの頂点データ(メッシュ)をGPUに送ります。
  3. 描画命令の発行: 準備が整ったところで、ようやく「描画実行!」という命令(ドローコール)を発行します。

問題は、異なるマテリアルを持つオブジェクトは、異なるレンダリングステートを必要とするため、別々のドローコールで描画しなければならない点です。例えば、赤い車と青い車が同じメッシュであっても、マテリアルが異なるため、2回のドローコールが必要になります。

シーン内のオブジェクトが1000個あり、それぞれが異なるマテリアルを持っていたら、単純計算で1000回のドローコールが発生し、CPUに大きな負荷がかかります。

バッチング:ドローコールをまとめる技術

この問題を解決するのがバッチングです。バッチングは、「いくつかのオブジェクトをまとめて1回のドローコールで描画する」技術の総称です。これにより、CPUからGPUへの命令回数を劇的に減らすことができます。

Unityには、主に2種類の自動バッチング技術が備わっています。

  1. スタティックバッチング (Static Batching)
  2. ダイナミックバッチング (Dynamic Batching)

スタティックバッチング

スタティックバッチングは、動かないオブジェクトに対して適用できる、非常に効果的なバッチング手法です。

  • 仕組み: シーン内の「Static」とマークされたオブジェクトのうち、同じマテリアルを共有するものを探し出し、それらのメッシュをビルド時に巨大な一つのメッシュに結合してしまいます。実行時には、この巨大な結合済みメッシュを1回のドローコールで描画します。
  • 使い方: バッチングしたいオブジェクトをInspectorで選択し、右上にあるStaticチェックボックスをオンにします。(Batching Staticだけで十分です)
  • 長所: ドローコールの削減効果が非常に高いです。
  • 短所: 動かないオブジェクトにしか使えません。また、結合後のメッシュを保持するためにメモリ使用量が増加します。
  • 適用対象: 背景、建物、地面、動かない小物など、シーンの静的な環境オブジェクト全般。

ダイナミックバッチング

ダイナミックバッチングは、動くオブジェクトに対して適用されるバッチング手法ですが、いくつかの厳しい制約があります。

  • 仕組み: 毎フレーム、同じマテリアルを共有するオブジェクトを探し、それらの頂点データを一つのバッファにまとめてGPUに送り、1回のドローコールで描画します。
  • 使い方: Project Settings > Player > Other SettingsDynamic Batchingにチェックが入っていれば、条件を満たすオブジェクトは自動的にバッチングされます。
  • 制約:
    • オブジェクトのメッシュが持つ頂点数が非常に少ない必要があります(通常は合計で数百頂点以下)。
    • オブジェクトが異なるスケールを持つ場合、バッチングされないことがあります。
    • マルチパスマテリアルや複雑なシェーダーでは機能しません。
  • 長所: 動くオブジェクトのドローコールを削減できます。
  • 短所: 制約が厳しく、効果は限定的です。また、毎フレームCPUがバッチング対象を探して頂点データをまとめるためのオーバーヘッドがかかります。
  • 適用対象: パーティクル、弾丸、単純な形状の敵など、頂点数の少ない動くオブジェクト。

ドローコールを削減するための手動テクニック

自動バッチングだけでは不十分な場合、デザイナーやプログラマが意識的にドローコールを削減するための工夫が必要です。

テクスチャアトラス (Texture Atlas)

複数の小さなテクスチャを、一枚の大きなテクスチャにまとめる手法です。これにより、複数のオブジェクトが同じマテリアルを共有できるようになり、バッチングの機会が大幅に増えます。

例えば、背景の小物(岩、木、草など)がそれぞれ別のテクスチャとマテリアルを持っていると、ドローコールが増えてしまいます。これらの小物のテクスチャを一枚の「アトラス」にまとめ、UVを調整して同じマテリアルを共有させれば、スタティックバッチングによって1回のドローコールで描画できるようになります。

GPUインスタンシング (GPU Instancing)

同じメッシュとマテリアルを持つオブジェクトを、非常に高速に、1回のドローコールで大量に描画するための技術です。草や木、群衆など、同じ見た目のオブジェクトを大量に配置する場合に絶大な効果を発揮します。

  • 使い方: マテリアルのInspectorでEnable GPU Instancingにチェックを入れます。
  • 特徴: 各インスタンス(オブジェクト)は、位置、回転、色などの一部のプロパティを個別に変更できます。スタティックバッチングと異なり、オブジェクトは動くことができます。

ドローコールの確認方法

現在のドローコール数(UnityではBatchesと表示されます)は、GameビューのStatsウィンドウで確認できます。このBatchesの数が、CPUの描画負荷の目安となります。最適化を行う際は、この数値を常に監視しましょう。

まとめ

ドローコールの最適化は、Unityのレンダリングパフォーマンスを向上させる上で最も重要な要素の一つです。

  • ドローコールはCPUからGPUへの描画命令。多すぎるとCPUがボトルネックになる。
  • バッチングは、ドローコールをまとめる技術。
  • スタティックバッチング: 動かないオブジェクトに効果絶大。Staticフラグを立てるだけ。
  • ダイナミックバッチング: 小さな動くオブジェクトに限定的に有効。
  • テクスチャアトラス: 複数のマテリアルを一つにまとめ、バッチングを促進する王道テクニック。
  • GPUインスタンシング: 同じ見た目のオブジェクトを大量に描画する際の最終兵器。

これらのテクニックを理解し、StatsウィンドウのBatches数を意識しながらシーンを構築することで、リッチな見た目と高いパフォーマンスを両立したゲーム開発が可能になります。