GPU レンダリング速度の検査と概要

Android には、必要以上に多いレンダリング タスクの処理またはスレッド上の長い処理や GPU 動作など、UI のレンダリングに関してアプリが遭遇している可能性のある問題の視覚化を支援する、端末開発者向けオプションが用意されています。 このページでは、GPU オーバードローのデバッグと GPU レンダリングのプロファイリングを行う方法について説明しています。

端末開発者向けオプションとそれらのオプションを有効にする方法の詳細については、端末の開発者向けオプションの設定をご覧ください。

GPU レンダリング速度のプロファイリング

Profile GPU Rendering ツールは、UI ウィンドウのフレームのレンダリングにかかった時間(1 フレームあたり 16ms のベンチマークに対する相対的な時間)のビジュアル表現をスクロール ヒストグラムとして表示します。

性能が低い GPU では、利用可能なフィルレート(GPU がフレーム バッファを充填する速度)がかなり低くなる可能性があります。 フレームの描画に要求されるピクセル数の増加に伴い、GPU による新しいコマンドの処理時間が長くなり、その処理が完了するまでシステムの残りの部分に待機を求めるという事態が発生する場合があります。 プロファイリング ツールを使用すると、ピクセルの描画を試みている際の GPU への過負荷や、過剰なオーバードローによる GPU オーバーヘッドが発生するタイミングを特定できます。

注: このプロファイリング ツールは、NDK を使用しているアプリに対して動作しません。 その理由は、OpenGL がフルスクリーン コンテキストを取得するときは常にフレームワーク メッセージがバックグラウンドにプッシュされるためです。 このようなケースでは、GPU のメーカーが提供するプロファイリング ツールが役立つ場合があります。

プロファイラの有効化

開始する前に、Android 4.1(API レベル 16)以降を実行している端末を使用していて、開発者向けオプションを有効にしていることを確認してください。 アプリの使用中に端末の GPU レンダリングのプロファイリングを開始するには、次の手順を実行します。

  1. 端末で [Settings] に移動し、[Developer Options] をタップします。
  2. [Monitoring] セクションで、[Profile GPU Rendering] を選択します。
  3. [Profile GPU Rendering] ダイアログで、[On screen as bars] を選択し、端末の画面にグラフをオーバーレイします。
  4. プロファイリングするアプリを開きます。

出力の検査

図 1 の Profile GPU Rendering グラフの拡大画像には、Android 6.0(API レベル 23)に表示される色付きのセクションが示されています。

図 1 拡大した Profile GPU Rendering グラフ

出力に関していくつかの点を説明します。

  • このツールは、表示されている各アプリのグラフを表示します。
  • 横軸に沿った各垂直バーはフレームを表し、各垂直バーの高さはフレームのレンダリングにかかった時間(ミリ秒単位)を表します。
  • 緑の水平線は 16 ミリ秒を表します。 1 秒あたり 60 フレームを実現するには、各フレームの垂直バーがこの水平線よりも下にある必要があります。 バーがこの水平線を超えると、アニメーションが一時停止する可能性があります。
  • このツールでは、16 ミリ秒のしきい値を超えたフレームを幅広くし、その透明度を低くしてハイライト表示しています。
  • 各バーには、レンダリング パイプラインのステージにマッピングされる色付きのコンポーネントがあります。 コンポーネントの数は、端末の API レベルによって異なります。

次の表では、Android 6.0 以降を実行している端末を使用しているときの、プロファイラ出力に表示される垂直バーの各セグメントについて説明しています。

バーのコンポーネントレンダリング ステージ説明
バッファ交換 CPU が GPU タスクの完了を待機している時間を表します。 このバーが高い場合は、アプリが GPU を過剰に使用しています。
コマンド発行 ディスプレイ リストを描画および再描画するために、Android の 2D レンダラが OpenGL へのコマンドの発行にかかった時間を表します。 このバーの高さは、各ディスプレイ リストの実行にかかった時間の合計に正比例します。ディスプレイ リストが増えると、赤いバーが高くなります。
同期 & アップロード ビットマップ情報を GPU にアップロードするのにかかった時間を表します。 セグメントが大きい場合は、アプリが大量のグラフィックの読み込みに長時間費やしています。
描画 ビューのディスプレイ リストの作成とアップデートにかかった時間を表します。 バーのこの部分が高い場合は、多くのカスタムビューが描画されているか、onDraw メソッドのタスクが多い可能性があります。
計測と配置 ビュー階層の onLayout コールバックと onMeasure コールバックにかかった時間を表します。 セグメントが大きい場合は、ビュー階層の処理に長時間かかっています。
アニメーション フレームを実行したすべてのアニメーターの評価にかかった時間を表します。 このセグメントが大きい場合は、アプリがパフォーマンスの悪いカスタム アニメーターを使用しているか、プロパティがアップデートされた結果として意図しないタスクが発生している可能性があります。
入力ハンドリング アプリが入力イベント コールバック内のコードを実行するのにかかった時間を表します。 このセグメントが大きい場合は、アプリによるユーザー入力の処理に時間がかかりすぎています。 こうした処理を別のスレッドにオフロードすることを検討してください。
その他の時間と VSync 遅延 アプリが 2 つの連続したフレーム間で動作を実行するのにかかった時間を表します。 UI スレッドで発生している過大な処理を示している可能性があります。こうした処理は別のスレッドにオフロードできる場合があります。

表 1. Android 6.0 以降のコンポーネント バー

バージョン 4.0(API レベル 14)からバージョン 5.0(API レベル 21)の Android には、青、紫、赤、およびオレンジのセグメントがあります。 バージョン 4.0 よりも前の Android には、青、赤、およびオレンジのコンポーネントがあります。 次の表では、Android 4.0 および 5.0 のコンポーネント バーについて説明しています。

バーのコンポーネントレンダリング ステージ説明
プロセス CPU が GPU タスクの完了を待機している時間を表します。 このバーが高い場合は、アプリが GPU を過剰に使用しています。
実行 ディスプレイ リストを描画および再描画するために、Android の 2D レンダラが OpenGL へのコマンドの発行にかかった時間を表します。 このバーの高さは、各ディスプレイ リストの実行にかかった時間の合計に正比例します。ディスプレイ リストが増えると、赤いバーが高くなります。
XFer ビットマップ情報を GPU にアップロードするのにかかった時間を表します。 セグメントが大きい場合は、アプリが大量のグラフィックの読み込みに長時間費やしています。 このセグメントは、Android 4.0 以前を実行している端末には表示されません。
アップデート ビューのディスプレイ リストの作成とアップデートにかかった時間を表します。 バーのこの部分が高い場合は、多くのカスタムビューが描画されているか、onDraw メソッドのタスクが多い可能性があります。

表 2. Android 4.0 および 5.0 のコンポーネント バー

プロファイリング ツールで提供される情報を解釈する方法の詳細については、Profile GPU Rendering を使用した分析をご覧ください。

注: このツールの名前は Profile GPU Rendering ですが、実際には、すべての監視対象プロセスは CPU で発生しています。 GPU にコマンドを送信するとレンダリングが実行され、GPU では画面が非同期的にレンダリングされます。 特定の状況で、GPU で実行するタスクが過剰になり、新しいコマンドを発行できるようになるまで CPU が待機する必要がある場合があります。 こうした状況が発生すると、オレンジと赤のバーが急激に高くなり、GPU コマンドキューが空くまでコマンドの送信がブロックされます。

GPU オーバードローの視覚化

開発者向けオプションのもう 1 つの機能を使用すると、UI を色分けして簡単にオーバードローを特定できます。 オーバードローは、アプリが同じピクセルを同じフレーム内で複数回描画すると発生します。 この視覚化により、アプリが必要以上にレンダリング タスクを実行している可能性のある領域を見つけることができます。不必要なレンダリング タスクは、ユーザーに表示されないピクセルをレンダリングする余分な GPU 動作に起因するパフォーマンス問題を引き起こす場合があります。 したがって、可能である限り必ずオーバードロー イベントを修正する必要があります。

まだ有効にしていない場合は、開発者向けオプションを有効にしてください。 その後、端末でオーバードローを視覚化するために、次の手順を実行します。

  1. 端末で [Settings] に移動し、[Developer Options] をタップします。
  2. [Hardware accelerated rendering] セクションまでスクロール ダウンし、[Debug GPU Overdraw] を選択します。
  3. [Debug GPU overdraw] ダイアログで [Show overdraw areas] を選択します。

Android は、オーバードローの量を特定するために、次のように UI 要素を色分けします。

  • True カラー: オーバードローなし
  • 青: オーバードロー 1 回
  • 緑: オーバードロー 2 回
  • ピンク: オーバードロー 3 回
  • 赤: オーバードロー 4 回以上

図 2. 通常の状態で表示されたアプリ(左)、GPU オーバードローを有効にして表示されたアプリ(右)

これらの色は半透明であり、画面に表示される正確な色は、UI のコンテンツによって異なることに注意してください。

これで、レイアウトでオーバードローが発生する領域が認識できました。次に、オーバードローを削減する方法をご覧ください。

一部のオーバードローは回避できないことに注意してください。 アプリのユーザー インターフェースを調整するにあたって、視覚化したときにほとんどが True カラーか、オーバードローが 1 回(青)だけで表示されることを目指してください。

図 3. 多くのオーバードローがあるアプリ(左)とオーバードローがはるかに少ないアプリ(右)の例