Unity iOS および Android はプロファイラーを同梱しています。ビルトインのプロファイラーはデバイス上で実行されているゲームからコンソールメッセージを表示します。これらのメッセージは 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) |
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 プロジェクトを開いて、InternalProfiler.h
ファイルを選択して、
#define ENABLE_INTERNAL_PROFILER 0
#define ENABLE_INTERNAL_PROFILER 1
Android 上では、デフォルトで有効化されています。ビルドする際に Player Settings で Development Build がチェックされていることを確認すれば、デバイスで実行されたときに logcat で統計情報が表示されます。logcat を表示するためには、__adb__
すなわち Android Debug Bridge が必要です。準備ができた後、シェルコマンド __adb logcat__
を実行するのみです。
の行を次のように変更します。 XCode メニューで View > Debug Area > Activate Console を選択して、出力コンソール( GDB )を表示して、次にプロジェクトを実行します。Unity は統計情報をコンソールウィンドウに 30 フレームごとに表示します。