ドローコールのバッチ処理は、ドローコール最適化 メッシュを結合して、Unity がより少ないドローコールでレンダリングできるようにする方法です。Unity には 2 つのビルトインのドローコールバッチ処理方法があります。
Unity のビルトインのドローコールのバッチ処理には、手動でメッシュをマージするのに比べいくつかの利点があります。最も重要なのは、Unity がまだメッシュを個別に削除できる点です。しかし、欠点もあります。静的バッチ処理はメモリとストレージのオーバーヘッドを発生させ、動的バッチ処理は CPU のオーバーヘッドを発生させます。
このセクションでは、Unity のドローコールのバッチ処理の方法とレンダーパイプラインの互換性についての情報を紹介します。
機能 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタムのスクリプタブルレンダーパイプライン (SRP) |
---|---|---|---|---|
静的バッチ処理 | あり | あり | あり | あり |
動的バッチ処理 | あり | あり | なし | あり |
以下の使用情報は、静的バッチ処理と動的バッチ処理の両方に関連しています。各ドローコールのバッチ方法固有の情報 (有効化の方法や使用方法など) については、静的バッチ処理 と 動的バッチ処理 を参照してください。
メッシュレンダラー、トレイルレンダラー、ラインレンダラー、パーティクルシステム、スプライトレンダラー はドローコールバッチ処理に対応します。Skinned Mesh Renderers Cloth など、他のタイプのレンダリングコンポーネントはサポートされていません。Unity はレンダラーを同じタイプの他のレンダラーとのみバッチ処理します (例えば、Mesh Renderer は Mesh Renderer とバッチ処理されます)。
Unity は、同じマテリアルを使用するゲームオブジェクトのドローコールをバッチ処理します。つまり、ドローコールのバッチ処理から最良の結果を得るために、できるだけ多くのゲームオブジェクト間でマテリアルを共有します。テクスチャだけが違う 2 つの同じマテリアルアセットがある場合、これらのテクスチャを結合して 1 つの大きなテクスチャにします。この処理は、テクスチャのアトラス化と呼ばれます 。詳しくは、テクスチャのアトラス化についての ウイキペディア記事 を参照してください。テクスチャが同じアトラスにあると、代わりに 1 つのマテリアルアセットを使用できます。
ビルトインレンダーパイプラインでは、MaterialPropertyBlock を使用すると、ドローコールのバッチ処理を中断することなくマテリアルのプロパティを変更することができます。CPU はまだレンダー状態の変更を行う必要がありますが、MaterialPropertyBlock
を使用すると複数のマテリアルを使用するよりも高速になります。プロジェクトでスクリプタブルレンダーパイプラインを使用している場合は、。マテリアルの SRP バッチャーの互換性を削除するため MaterialPropertyBlock
を使用しないでくだ さい。
透明なシェーダーは、しばしば、Unity がメッシュを後方から手前の順にレンダリングすることを必要とします。透明なメッシュをバッチ処理するために、Unity はまずメッシュを後方から手前の順に並べ、それからバッチ処理を試みます。Unity はメッシュを後方から手前に向かってレンダリングする必要があるため、多くの場合、透明なメッシュに不透明なメッシュと同等数のバッチ処理を行うことはできません。
ドローコールのバッチ処理を使用できない場合、互いに近いメッシュを手動で結合することが良い代替方法となり得ます。メッシュの結合の詳細は、メッシュの結合 を参照してください。
注意: C# スクリプトから共有マテリアルプロパティにアクセスする場合は、Renderer.material ではなく、Renderer.sharedMaterial を必ず使用してください。Renderer.material
はマテリアルのコピーを作成し、そのコピーをレンダラーに返します。これにより、Unity がそのレンダラーのドローコールをバッチ処理するのを防ぎます。
2017–10–26 修正されたページ
グラフィックスジョブと互換性のない動的なバッチ処理に関するノートは 2017.2に追加