2019.8.21はじめにこんばんは、代表の堂前です!技術的な話を書くのがだいぶ久しぶりになりました・・・。今月までは忙しかったので、これからはたくさん書けるといいな〜と思っております。それでは今回から数回にかけて、Unity描画のバッチング処理についてまとめていきます。Batchingの処理の中身」についてお届けします。※検証したのはMacのUnity5.5.2f1になります。バッチング処理とは?まず簡単に、バッチング処理とはというところと、その効果について触れます。Unityのドキュメントはこちらになります。言うと、同じマテリアルの複数のオブジェクトがある際、それを予め一つにまとめて描画するという仕組みです。以下がその例になります。Debugger状況ですが、OFFの時は8回描画しているのに対しONは1回にまとめられています。処理負荷の観点で非常に効果がありそうな感じがします。Batching」のチェックを有効にするだけです。Batching」に分かれていますが、これにはそれぞれの用途があります。Batching」の方は、シーン内の静的(動かない)オブジェクトに適応します。これはプログラムの話ではなく一般的なイメージとして、処理する時に「動く」or「動かない」とでは「動かない」方が色々と処理が省けそうというのがわかります。座標が動かないので変形はしません。Batching」は、そういうものだけまとめる処理です。(ゲームでは、背景に適応するのが一般的です。)Unityでは以下の様にオブジェクトに対し「Static」のチェックを入れます。Static」がオンになっていればいいです。Batching」もONにした状態で実行すると、下の様にバッチング処理が行われるのが分かります。前置きが長くなりましたが、ここからが本題です。Batching処理の中身を覗いてみましょう!気になるのは毎フレーム一定の処理がかかるのかです。これは結論から言うと、毎フレームに掛かる処理はほぼ無いはずです。Batchingは組み合わせたメッシュを最初に作成し、それを毎フレーム表示しているだけです。Mesh」がいつ用意されるかですが、それを調べてみます。どの様な処理が入っているかをProfilerでチェックします。調査してみて、該当シーンの読み込み時に怪しそうなところを見つけました。InternalStaticBatchingUtility.Combine()というのがそれを行なっているものと思われます。完全に処理を把握しているわけではなく推測も含めますが、動的に確保や生成を行なっているということになります。見てみると今回はそれなりに高速なPCではありますが、それでも5.37msec掛かっていることから、シーン読み込み時のスパイクが不安になってきます。Meshを一時的に重複して持っていることから、ガベージコレクトの発生の可能性なども不安です。これらを回避したい場合、予め組み合わせた形状のモデルを作っておいて利用という方法が挙げられます。これはレベルエディタの観点からエディタを使う利便性を自ら放棄していることにもなるので、必ずしもオススメと言えません。サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。株式会社ロジカルビートコメントは停止中です。