CPU と GPU のフレーム処理時間(フレーム時間)の見積もりは、アプリのパフォーマンスを把握し、ボトルネックを特定するうえで不可欠です。AGI を使用してアプリをプロファイリングすると、System Profiler からトレースデータが提供され、それを使用してフレーム時間を推定できます。
CPU 時間
AGI では、システム プロファイルの CPU トラックで、合計 CPU フレーム時間とアクティブな CPU フレーム時間を確認できます。
合計 CPU 時間
費やされた合計 CPU 時間を測定するには、連続するフレーム送信イベントの間隔を含む時間範囲を選択します。フレーム送信イベントは eglSwapBuffers
(OpenGL の場合)と vkQueuePresentKHR
(Vulkan の場合)です。
この測定値は合計 CPU 時間の推定値ですが、必ずしもアクティブな CPU 時間を示しているわけではありません。たとえば、GPU にバインドされたアプリでは、CPU は GPU が作業を完了するまで待ってから新しいフレームを送信することができます。これは、dequeueBuffer
、eglSwapBuffer
(OpenGL の場合)、vkQueuePresent
(Vulkan の場合)のイベントが CPU 時間の大部分を占める場合によく発生します。待機時間は合計 CPU 時間に含まれますが、アクティブな CPU 時間は含まれません。
アクティブな CPU 時間
アクティブな CPU 時間は、CPU がアイドル状態でアプリコードを実行している時間を決定します。
アクティブな CPU 時間を測定するには、CPU イベントのすぐ上に [Running] スライスを表示します。Running 状態の 2 つのフレーム送信イベント間のトレースのすべての部分をカウントします。作業スレッドが含まれていることを確認してください。
アクティブな CPU 時間を測定するもう 1 つの方法は、CPU トラックでアプリスライスを表示することです。これらのスライスは CPU の実行中であり、Running スライスに対応しています。
ATrace マーカーをアプリに追加すると、アプリスライスを識別しやすくなります。これにより、System Profiler の CPU トラックにマーカーが表示されます。
GPU フレーム時間を見積もる
GPU フレーム時間を推定するには、System Profiler で GPU スライスまたは GPU カウンタを使用します。GPU スライスを使用すると、より正確な推定値が得られます。
GPU スライス
System Profiler に使用可能な GPU スライス情報がある場合、単一フレームに関連付けられたタスクにアプリが費やした合計時間を測定することで、非常に正確な GPU フレーム時間情報を取得できます。
Mali デバイス
Mali デバイスでは、GPU スライスにフラグメント トラック、非フラグメント トラックがあります。また、場合によっては、非フラグメント トラックの補助トラックもあります。より複雑でないフレームの場合、フラグメントの処理と非フラグメントの処理は順次行われるため、アクティブな GPU 処理間のギャップを探すことでフレームの処理を区別できます。
別の方法として、GPU に送信される処理に精通している場合は、送信されたレンダリングパスのパターンを特定することで、フレームの開始時点と終了時点に関する情報を得ることができます。
より高度に並列化された GPU ワークフローを持つアプリでは、各スライスの [Selection] ペインで同じ submissionID を持つフレームをすべて検索することで、GPU フレーム時間を取得できます。
Vulkan ベースのアプリの場合、複数の送信を使用してフレームを作成できます。送信 ID をトラッキングするには、各送信のスライスを含む Vulkan イベント トラックを使用します。送信スライスを選択すると、送信に対応するすべての GPU アクティビティ スライスがハイライト表示されます。
Adreno デバイス
Adreno デバイスでは、GPU スライスは GPU キュー 0 トラックに表示され、常に順番に表されます。これにより、フレームのレンダリングパスを表すすべてのスライスを確認し、GPU フレーム時間を測定できます。
前述のマリのシナリオと同様に、アプリが Vulkan を使用している場合、Vulkan イベント トラックは、フレームを実行するために送信される処理に関する情報を提供します。レンダリング パスをハイライト表示するには、フレームに関連付けられている Vulkan Events スライスをクリックします。
アプリが GPU に大きく依存するため、GPU フレーム境界の区別が難しい場合があります。このようなシナリオでは、GPU に送信される作業に精通していれば、レンダリングパスが実行されているパターンを特定し、その情報からフレーム境界を特定できます。
GPU カウンタ
トレースで GPU スライス情報が利用できない場合は、GPU カウンタ トラックを使用して GPU フレーム時間を推定できます。
Mali デバイス
Mali デバイスでは、[GPU 使用率] トラックを使用して、GPU を集中的に使用するアプリの GPU フレーム時間を推定できます。アプリの GPU 負荷が低い場合、一貫して高いアクティビティではなく、定期的に高いまたは低い GPU アクティビティが発生します。GPU 使用率トラックを使用して GPU フレーム時間を推定するには、トラック内でアクティビティが高い期間の継続時間を測定します。
アプリで GPU 負荷が高い場合は、フラグメント トラックと非フラグメント トラックを使用して、GPU フレーム時間を推定できます。フラグメント トラックと非フラグメント トラックのアクティビティ レベルのパターンを探すことで、フレームの境界位置を大まかに推定し、それを使用して GPU フレーム時間を測定できます。
Adreno デバイス
Adreno デバイスでは、アプリが GPU を多用しない場合、前のセクションの Mali デバイスの場合と同じ方法で GPU フレーム時間を推定できます。
アプリの GPU 負荷が高い場合は、[Vertex Instructions / Second] トラックと [Fragment Instructions / Second] のトラックを使用して GPU フレーム時間を推定できます。これらのトラックのアクティビティ レベルでパターンを探すことで、フレームの境界の位置を大まかに推定し、それを使用して GPU フレーム時間を測定できます。
以下の他のトラックでも同様の情報が得られます。
- 頂点の色分け / 秒
- シェーディングされたフラグメント / 秒
- 時間シェーディングの頂点の割合(%)
- 時間フラグメントの割合