【Unity】バッチングについて(第1回・Static Batchingの処理の中身)

投稿者: | 2017年3月20日

はじめに

こんばんは、代表の堂前です!

技術的な話を書くのがだいぶ久しぶりになりました・・・。
今月までは忙しかったので、これからはたくさん書けるといいな〜と思っております。

それでは今回から数回にかけて、Unity描画のバッチング処理についてまとめていきます。
初回は「Static Batchingの処理の中身」についてお届けします。

※検証したのはMacのUnity5.5.2f1になります。


バッチング処理とは?

まず簡単に、バッチング処理とはというところと、その効果について触れます。
Unityのドキュメントはこちらになります。

ざっくりと言うと、同じマテリアルの複数のオブジェクトがある際、それを予め一つにまとめて描画するという仕組みです。
以下がその例になります。

Scene状況 バッチングOFF バッチングON

今回のシーンはオブジェクトが8つあってそのマテリアルが全て同じ状況で、右2つはバッチングがON/OFFの時のFrame Debugger状況ですが、OFFの時は8回描画しているのに対しONは1回にまとめられています
処理負荷の観点で非常に効果がありそうな感じがします。

Unityでこれを有効にするには「Player Settings」で以下の「Static Batching」「Dynamic Batching」のチェックを有効にするだけです。

で、今回はその中の「Static Batching」の方に触れます!


Static Batching処理の概要

バッチング処理で「Static Batching」と「Dynamic Batching」に分かれていますが、これにはそれぞれの用途があります。
「Static Batching」の方は、シーン内の静的(動かない)オブジェクトに適応します。

これはプログラムの話ではなく一般的なイメージとして、処理する時に「動く」or「動かない」とでは「動かない」方が色々と処理が省けそうというのがわかります。
例えば、座標が動かないので変形はしません。
「Static Batching」は、そういうものだけまとめる処理です。
(ゲームでは、背景に適応するのが一般的です。)

Unityでは以下の様にオブジェクトに対し「Static」のチェックを入れます
(厳密に言えば「Batching Static」がオンになっていればいいです。)

「Player Settings」の「Static Batching」もONにした状態で実行すると、下の様にバッチング処理が行われるのが分かります。

バッチングOFF バッチングON
MeshFilter
実際のMesh

バッチングが有効な時はMesh Filterが「Combined Mesh」となり、まとめられたものがMeshとして利用される様になります!


Static Batching処理の中身

前置きが長くなりましたが、ここからが本題です。
Static Batching処理の中身を覗いてみましょう!

気になるのは毎フレーム一定の処理がかかるのかです。
しかしこれは結論から言うと、毎フレームに掛かる処理はほぼ無いはずです。
Static Batchingは組み合わせたメッシュを最初に作成し、それを毎フレーム表示しているだけです。


(※これを最初に作って描画しているだけ)

つまり「Combined Mesh」がいつ用意されるかですが、それを調べてみます。
どの様な処理が入っているかをProfilerでチェックします。

調査してみて、該当シーンの読み込み時に怪しそうなところを見つけました。
InternalStaticBatchingUtility.Combine()というのがそれを行なっているものと思われます。

完全に処理を把握しているわけではなく推測も含めますが、動的に確保や生成を行なっているということになります。

見てみると今回はそれなりに高速なPCではありますが、それでも5.37msec掛かっていることから、シーン読み込み時のスパイクが不安になってきます。
そしてメモリの面でもオリジナルのものとCombined Meshを一時的に重複して持っていることから、ガベージコレクトの発生の可能性なども不安です。

これらを回避したい場合、予め組み合わせた形状のモデルを作っておいて利用という方法が挙げられます。
ただこれはレベルエディタの観点からエディタを使う利便性を自ら放棄していることにもなるので、必ずしもオススメと言えません。

最終的に毎フレーム時の処理コストを気にしなくて良いので、これらの処理が気にならないかどうかであると思うのですが、上記処理が発生しているというのは念頭に置いておいた方が良いでしょう。


 

 

【免責事項】
本サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。

【Unity】バッチングについて(第1回・Static Batchingの処理の中身)」への1件のフィードバック

  1. ピンバック: 【Unity】バッチングについて(第2回・Static Batchingとカリング) – 株式会社ロジカルビート

コメントは停止中です。