Unity におけるパフォーマンス最適化 【ドローコールバッチング編】

結局なにをしたら最適化されるの

1. マテリアルを節約しましょう
2. マップなどの大きくて動かないオブジェクトは Static フラグをたてましょう

やってみて上手くいかない場合は、記事の続きを読んでみてください。

 

 

f:id:shogonir:20151216153528p:plain

 

 

ドローコールバッチングとは

 

docs.unity3d.com

 

Unity のマニュアルのリンクを貼っておきましたが、この記事でも噛み砕いて説明を記載しておきます。

ドローコールバッチングとは、Unity 等のエンジンがグラフィックAPI を呼び出す(ドローコール)処理をまとめる(バッチング)こと
OpenGLDirect3D などのグラフィックAPI を呼び出すドローコールは、 CPU や GPU の処理能力を多く使用します。
このドローコールをまとめ、呼び出し回数を減らすことで、 Unity 等のパフォーマンス最適化を達成すること。

Unity のマニュアルでは、ドローコールバッチングには静的(static)バッチングと動的(dynamic)バッチングが紹介されています。
それぞれの意味と、その恩恵を受けるために開発者がすべきことを説明します。

 

 

静的(static)バッチング

静的バッチングは、「あるオブジェクトが静的(移動や回転やスケールしない)である」ことを先に宣言することでドローコールを節約する方法です。
また、静的バッチングではあらかじめそのオブジェクトの描画に必要な情報をメモリにのせておくことになるので注意が必要です。
使用する場面が限られますが、動的バッチングよりも顕著に効果があるようです。

静的バッチングを有効にするには、そのオブジェクトの Static フラグをたてるだけで OK です。
GUI からは Inspector 内、オブジェクト名の隣にあるチェックボックスから操作できます。

f:id:shogonir:20151217155714p:plain

個人的な感想としては、体感できるほどパフォーマンスの向上を感じず、ビルドにかかる時間が増えたり Unity エディタの動きがもっさりしたりで、そこまで嬉しくありませんでした。
もちろん僕が Static フラグをたてたオブジェクトが少なかったなどの原因があるかもしれませんので、一度試す価値は十分にあると思います。
特にマップなどの大きなオブジェクトがあれば効果的なのかもしれません。

 

 

動的(dynamic)バッチング

動的バッチングは、同じマテリアルの複数のオブジェクトを描画する際にドローコールを節約する方法です。
動的バッチングは静的バッチングよりも制限が緩やかで、かつ同じマテリアルのオブジェクトがあれば自動的に最適化してくれるために非常に便利です。

動的バッチングを有効にするには、マテリアルの節約が必要になります。

個人的には、体感できるレベルでパフォーマンスが向上し、 Project 内の Hierarchy も整理できて一石二鳥でした。
サマーウォーズの OZ を Unity で再現してみた」では、完成間近の段階でマテリアルの数を半分以下に節約したところ、倍に近いぐらいパフォーマンスが改善された気がします。

 

 

さいごに

この記事には個人的な感想や宣伝が含まれているため、やはり自分で試してみるのが一番だと思います。
Unity で開発していて感じたのですが、パフォーマンスの最適化という、一般のゲームエンジンであれば「かゆいところに手が届かない」ともなりかねない場面ですが、意外と簡単に最適化の恩恵を受けることが出来て驚きました。
まぁ、いくつものゲームエンジンを触ってきたわけでもない素人の感想ですが。