プロファイラー出力の分析
Investigate common startup and runtime performance issues by analyzing Profiler traces.
読み終わるまでの所要時間 16 分最終更新 1ヶ月前
アプリケーションをプロファイルする時に、いくつかの一般的な問題が発生する可能性があります。このページでは、一般的なパフォーマンス問題の原因を調査する方法について説明します。
起動時の出力の分析
起動時間のプロファイリング出力を確認する場合、主に調査すべきメソッドは 2 つあります。 と です。プロジェクトの設定、アセット、コードによる起動時間への影響に関しては、主にこの 2 つのメソッドが原因となります。
UnityInitApplicationGraphicsUnityLoadApplication注意アプリケーションの起動時間はプラットフォームによって異なります。ほとんどのプラットフォームでは、起動は スプラッシュスクリーン の表示中に行われます。

iOS デバイスで実行したサンプル Unity プロジェクトの Instruments の出力
上の iOS デバイスで実行したサンプル Unity プロジェクトの Instruments の出力のスクリーンショットで、プラットフォーム別の メソッド内の、 メソッドと メソッドに注目してください。
startUnityUnityInitApplicationGraphicsUnityLoadApplicationUnityInitApplicationGraphicsUnity の リソースシステム には、プロジェクトの フォルダー内の フォルダーにあるデータ内の全ての アセットファイル が含まれます。これには、 フォルダーの子フォルダーにある全てのファイルが含まれます。したがって、リソースシステムの初期化に掛かる時間は、アプリケーションのプロジェクトの フォルダー内のファイル数に応じて直線的に増加します。
AssetsResourcesResourcesResourcesUnityLoadApplicationMonoBehaviourAwake上記のようなプロセスになっているということは、つまり、プロジェクトの最初のシーン内の コールバック内に長時間掛かるコードが 1 つでもある場合、そのコードが原因でプロジェクトの最初の起動時間が長くなっている可能性があるこということです。これを解決するには、時間の掛かるコードを削除するか、そのコードをアプリケーションのライフサイクル内の他の場所で実行するようにする必要があります。
Awakeランタイムの出力の分析
最初の起動時間の後にキャプチャされたプロファイリング出力に関しては、主に注目すべきは メソッドです。これは Unity のメインループで、中にあるコードが 1 フレームに 1 回実行されます。
PlayerLoop
サンプル Unity プロジェクトの Instruments の出力
上のスクリーンショットは、 内でパフォーマンスに最も影響を与えるいくつかのメソッドを示しています。注意 内のメソッドの名前は Unity のバージョンによって異なる可能性があります。
PlayerLoopPlayerLoopPlayerRenderBaseBehaviourManagerCommonUpdateMonoBehaviour- は
CommonUpdate<UpdateManager>コールバックを呼び出します。Update - は
CommonUpdate<LateUpdateManager>コールバックを呼び出します。LateUpdate - は、物理演算システムにチェックマークが入っている場合に
CommonUpdate<FixedUpdateManager>を呼び出します。FixedUpdate
調査する上で基本的に最も便利なメソッドファミリは です。これが Unity プロジェクト内で実行される大部分のスクリプトコードのエントリーポイントだからです。
BaseBehaviourManager::CommonUpdate<UpdateManager>他にも、調査に役立つメソッドがいくつかあります。
- は、プロジェクトが UGUI システム を使用している場合に、いくつかの異なるコールバックを実行します。これには Unity UI のバッチ計算やレイアウト更新が含まれます。プロファイラーに
UI::CanvasManagerが表示される場合、その原因として最もよく見られるのは、この 2 つの処理です。CanvasManager - は コルーチン を実行します。
DelayedCallManager::Update - は PhysX 物理演算システムを実行します。これは主に PhysX の内部コードを実行することによって行われます。
PhysicsManager::FixedUpdateやRigidbodyなど、現在のシーン内にある物理演算オブジェクトの数は、PhysX の内部コードに影響します。物理演算ベースのコールバックもここに表示されます。具体的には、ColliderとOnTriggerStayです。OnCollisionStay
プロジェクトが 2D 物理演算を使用している場合、それは、一式の類似したコールとして の下に表示されます。
Physics2DManager::FixedUpdateスクリプトメソッドの分析
スクリプトが IL2CPP を用いてクロスコンパイルされてプラットフォーム上で実行されている場合、 オブジェクトの含まれる出力ラインを探してください。そこが、Unity の内部ネイティブコードが、スクリプトコードを実行するためにスクリプトランタイムへ遷移している箇所です。注意技術的には、Unity が IL2CPP 経由で実行した後は、C# コードもネイティブコードとなります。ただしこのクロスコンパイルコードは、主に IL2CPP ランタイムフレームワークでメソッドを実行しており、手書きの C++ とは類似しません。
ScriptingInvocation
サンプル Unity プロジェクトからの出力
上のスクリーンショットで、 ラインの下にネストされたメソッドは、1 フレーム毎に 1 回実行されるクロスコンパイル済み C# スクリプトの一部です。
RuntimeInvoker_Void出力ラインの名前は、元のクラス名、下線、元のメソッド名の順で連なった形になっています。このサンプルの出力では、、、その他いくつかの メソッドが確認できます。これらは、ほとんどの 内に見られる、Unity の標準の コールバックです。
EventSystem.UpdatePlayerShooting.UpdateUpdateMonoBehavioursUpdateこれらのメソッドを展開すると、その中のどのメソッドが CPU 時間を消費したかを確認できます。これは、プロジェクト内、Unity API 内、C# ライブラリコード内のその他のスクリプトメソッドに関しても同様に行えます。
上の出力からは、 メソッドが 1 フレーム毎に 1 回、UI 全体にレイキャストを行っていたことが確認できます。このメソッドは、何らかのタッチイベントが UI 要素上をホバリングしたり要素をアクティベートしたりしていたかどうかを検知します。全ての UI 要素に対してメソッドを繰り返し、マウスの位置がその境界矩形内にあるかどうかをテストすると、高いリソース負荷が掛かります。
StandaloneInputModule.Processアセットの読み込み
CPU の出力内でアセットのロードを特定することもできます。アセットのロードを示す主要なメソッドは です。このメソッドは特定のファイルからのバイナリデータストリームを、 という名前のメソッドによって実行される Unity のシリアル化システムに接続します。 メソッドは、テクスチャ、MonoBehaviour、パーティクルシステムを始めとする全てのアセットタイプに見られます。
SerializedFile::ReadObjectTransferTransfer
シーンのロードの出力
上のスクリーンショットは、Unity がシーンをロードした出力です。シーンをロードすると、Unity はシーン内の全てのアセットを読み込み、デシリアライズします。これは、 の下にあるさまざまな メソッドのコールによって示されます。
SerializedFile::ReadObjectTransferランタイムにパフォーマンススタッターが発生し、パフォーマンス出力で がかなりの時間を費やしたことが示されている場合は、アセットのロードによってフレームレートが減少したことを意味します。ノート: は通常、、、または AssetBundle API がアセットの同期的ロードをリクエストすると、メインスレッドに表示されます。
SerializedFile::ReadObjectSerializedFile::ReadObjectSceneManagerResourcesこのパフォーマンススタッターを解決するには、アセットのロードを非同期にする (重い コールがワーカースレッドに移される) か、一部の重いアセットをプリロードしてください。
ReadObjectTransferCloneObjectTransferCloneObject