Unity iOS および Android はビルトインのプロファイラを同梱しています。これはアドオンの全てのバージョンに含まれていて,Unity Pro のみの機能 ではありません 。(一方,Unity Pro アドオンにはより高度なプロファイラが含まれます。)ビルトインのプロファイラはデバイス上で実行されているゲームからコンソールメッセージを表示します。これらのメッセージは 30 フレームごとに書き込みされゲーム実行に関する情報を提供します。これらのメッセージが意味することを常に理解することは必ずしも容易ではありませんが,最低限でゲームが CPU または GPU により制約を受けているか判断できますし,もし CPU による制約の場合はスクリプトのコード実行,または Mono によるガーベージコレクションが処理遅延の要因か分かります。このページの後半でビルトイン プロファイラを設定する方法を学ぶことができます。
ビルトイン プロファイラの出力例は次のとおりです。.
iPhone/iPad Unity internal profiler stats:
cpu-player> min: 9.8 max: 24.0 avg: 16.3
cpu-ogles-drv> min: 1.8 max: 8.2 avg: 4.3
cpu-waits-gpu> min: 0.8 max: 1.2 avg: 0.9
cpu-present> min: 1.2 max: 3.9 avg: 1.6
frametime> min: 31.9 max: 37.8 avg: 34.1
draw-call #> min: 4 max: 9 avg: 6 | batched: 10
tris #> min: 3590 max: 4561 avg: 3871 | batched: 3572
verts #> min: 1940 max: 2487 avg: 2104 | batched: 1900
player-detail> physx: 1.2 animation: 1.2 culling: 0.5 skinning: 0.0 batching: 0.2 render: 12.0 fixed-update-count: 1 .. 2
mono-scripts> update: 0.5 fixedUpdate: 0.0 coroutines: 0.0
mono-memory> used heap: 233472 allocated heap: 548864 max number of collections: 1 collection total duration: 5.7
全ての時間はミリ秒毎フレームで測定されます。直近30フレームの最小,最大,平均時間が見られます。
cpu-player | ゲームがUnityエンジンの中でコード実行およびスクリプト実行がCPU上で消費する時間を表示 |
cpu-ogles-drv | OpenGL ESドライバのコード実行がCPU上で消費する時間を表示。ドローコール,内部レンダリングのステート変更,レンダリング パイプライン セットアップおよび処理する頂点数がドライバの統計に影響します |
cpu-waits-gpu | GPUによるレンダリング完了を待機しているCPUのアイドル時間。もしこの数が2–3ミリ秒を超える場合,アプリケーションはフィルレートまたはGPU処理能力がボトルネックの可能性が高いです。もし値が小さすぎる場合,プロファイルは値の表示をスキップします |
msaa-resolve | アンチエイリアスの適用に要した時間 |
cpu-present | OpenGL ESのpresentRenderbufferコマンド実行に要した時間 |
frametime | ゲーム フレームの総時間を表します。iOSハードウェアは常に60Hzのリフレッシュレートにロックされているため,16.7msの倍数の時間が得られます。(1000ms/60Hz = 16.7ms) |
draw-call # | フレーム毎のドローコール数。出来る限り低く抑えて下さい。 |
tris # | レンダリングに送信される三角形の総数 |
verts # | レンダリングに送信される頂点の総数。静的な物体では10000以内に抑えれば良いですが,たくさんのスキニングされた物体がある場合はもっと低く抑えるべきです。 |
batched | エンジンによりバッチされたドローコール,三角形,および頂点の数。この数をドローコールおよび三角形の総数と比較することでシーンがバッチするのに適しているか判断する材料となります。バッチを改善するためには出来る限りマテリアルを共有するべきです。 |
player-detail セクションによってエンジンの動作について詳細な内訳が表示されます:-
physx | 物理エンジンの計算に要した時間 |
animation | ボーン アニメーションに要した時間 |
culling | カメラのFrustum外のオブジェクト カリングに要した時間 |
skinning | スキンメッシュへのアニメーション適用に要した時間 |
batching | 物体のバッチに要した時間。動的な物体のバッチは静的な物体のバッチより顕著に高価です。 |
render | 表示されるオブジェクトのレンダリングに要した時間 |
fixed-update-count | このフレームで実行された最小および最大のFixedUpdateの数。FixedUpdateの数が大きすぎるとパフォーマンスが著しく劣化します。fixed time deltaについて良い値を設定するためにいくつかシンプルなガイドラインが ここに あります。 |
mono-scripts セクションにより,Monoランタイムのコード実行に要した時間について詳細な内訳が表示されます:
update | スクリプトの全てのUpdate() 実行に要した総時間 |
fixedUpdate | スクリプトの全てのFixedUpdate() 実行に要した総時間 |
coroutines | スクリプトのコルーチン内で要した時間 |
mono-memory セクションにより,Monoガーベージコレクターによりメモリ管理がどのように管理されているかの情報がみられます:
allocated heap | メモリ使用可能な量。メモリ割り当ての際に十分なメモリがヒープに残っていない場合,ガーベージコレクションが起動されます。もしコレクションの後もまだ十分な空きメモリがない場合,割り当てヒープサイズが大きくなります。 |
used heap | allocated heap のうち,オブジェクトにより使用されている量。新しいクラスインスタンスを作成するたびに(構造体ではなく),この数は次のガーベージコレクションまで増え続けます。 |
max number of collections | 直近30フレームでのガーベージコレクションが行われた回数 |
collection total duration | 直近30フレームでのガーベージコレクションの総時間(ミリ秒単位) |
iOS ではデフォルトで無効となっているため,有効化するためには Unity により生成された XCode プロジェクトを開いて, iPhone_Profiler.h
ファイルを選択して,
#define ENABLE_INTERNAL_PROFILER 0
の行を次のように変更します:
#define ENABLE_INTERNAL_PROFILER 1
XCode メニューで
を選択して,出力コンソール(GDB)を表示して,次にプロジェクトを実行します。Unity は統計情報をコンソールウィンドウに 30 フレームごとに表示します。Android 上では,デフォルトで有効化されています。ビルドする際に Player Settings で Development Build がチェックされていることを確認すれば,デバイスで実行されたときにlogcat で統計情報が表示されます。logcat を表示するためには, <span class="doc-prop">adb</span>
すなわち Android Debug Bridge が必要です。準備ができた後,シェルコマンド <span class="doc-prop">adb logcat</span>
を実行するのみです。