Android GPU Inspectorを使ったUE4プロジェクトのモバイルGPUトレースプロファイリング

この記事はOpen Betaとして公開されているAndroid GPU Inspector(AGI)を使ってUE4のプロジェクトをみていきます。CPUの動きもちゃんと見れそうなので、フレームレートが出せない時にCPUネックなのかGPUネックなのかといったことを調べるのに便利そうです。
![screenshot_2021_07_03_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/84e03bd5-478e-46c8-d3a3-e78956afda76.png)


# ・ サポートされている端末
Android GPU Inspectorが現在対応しているのはAndroid 11以上のいくつかの端末です。
Google Pixel系列、Sumsung Galaxyシリーズ、OPPOのFind X3シリーズが対応しているみたいです。
Githubの方を見てるとOneplusあたりも追加されそうな雰囲気がありOppoさんの勢いを感じます。
_Supported Devices_
https://gpuinspector.dev/docs/devices

# ・ ダウンロード
記事作成時の(2021/07)最新安定バージョンは1.0.0で、以下の場所でバイナリがリリースされているようです。今回は1.0.0のWindows版で進めていきます。
__安定版(1.0.0)__
https://github.com/google/agi/releases/latest
__開発版(1.1.0-dev)__
https://github.com/google/agi-dev-releases/releases/latest

# ・ 準備
UEでAndroid向けのパッケージを作成し端末にインストールを行っておきます。
AGIを使用するためにADBのインストールが必要となりますが、UEのAndroidビルドが成功していれば導入済みかと思われます。
![screenshot_2021_07_03_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/a0c70b43-5b44-bce0-61b9-b20ec412a97e.png)
__Android プロジェクトのパッケージ化 | Unreal Engine ドキュメント__
https://docs.unrealengine.com/4.26/ja/SharingAndReleasing/Mobile/Android/PackagingAndroidProject/

# ・ 起動
AGIのZIPを展開してAGI.exeを起動すると以下の画面が表示されます。ログ等をGoogleに送るかといったオプションを選択しADBのパスを指定します。
![screenshot_2021_07_03_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/87f33400-a31a-9c56-8394-bee66e2ea7e8.png)

設定が終わると以下のような画面が表示されます。Capture a new trace[Ctrl+T]でキャプチャ。シンプルでいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/bafd2364-8732-eb20-ebaf-49024be81490.png)

# ・ 実機の接続
## 1. 端末チェック
ここで端末のチェックがあります。今回はPixel4で確認を行っています。
端末の選択を行うと付属のAPPパッケージが実機で走り確認作業が行われるようです。
![screenshot_2021_07_03_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/1d1d933d-b4ad-e15c-dbca-ee411a7f64a2.png)

無事終わると利用可能になります。
![screenshot_2021_07_03_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/f5a4dc9b-48d7-0777-4223-5fedd79b432c.png)

## 2. パッケージの選択
次にキャプチャしたいパッケージを選択します。...をクリックしインストールしたAndroidパッケージを選択します。
![screenshot_2021_07_03_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/1fd783ae-3ac7-ce3c-7db0-7a210eab74d2.png)

## 3. 時間と保存先の指定
次にキャプチャ時間とデータの保存先を指定します。
![screenshot_2021_07_03_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/4be41044-0279-7c9b-c8eb-b7824c3d7cc4.png)

## 4. キャプチャ 
設定画面でOKを押すと以下のような待機画面となります。
実機上でキャプチャしたい場所に移動(操作)しStartを押すとキャプチャが始まります。
![screenshot_2021_07_03_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/5667741d-3d9b-cf8e-1b59-d76929044778.png)

# ・ キャプチャ後の操作
キャプチャを行うと以下のような画面になるかと思います。ここでは抑えとくと便利な操作方法を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/0636494f-c66e-8415-9a65-35be722eef15.png)

## - ピン留め
各要素の横にマウスオーバーを行うとピン留めのアイコンが表示されます。これをクリックするとウィンドウ上部にそのカウンタ等の要素が止められます
一覧の下の方にあるProcesses内に起動しているゲームのGame ThreadやRender Threadがあるので、ピン留めを行った画像が以下です。
![screenshot_2021_07_03_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/30b70ec9-135c-3385-fa96-73b4dd32d5b7.png)

## - Mode(操作方法)
ウィンドウ左上にModeというツールがあります。これによりマウスカーソル挙動が変わります。
![screenshot_2021_07_03_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/3e5f177f-5a2d-08d5-c6ef-764bbc37e25c.png)

### ・Select
Selectは短形選択が可能です。様々な要素を個別で選択したり範囲選択できたりします。
選択した要素についての詳しい情報がウィンドウ下部に表示されます。
![screenshot_2021_07_03_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/fc5d96c6-f23b-7afb-23af-528a6545143c.png)

### ・Pan
グラフを横に動かす(Pan操作)ためのツールです。

### ・Zoom
グラフのズーム動作を行うためのツールです。

### ・Timing
時間軸上で範囲選択を行うためのツールです。ある特定の時間からある時間を指定するために使用するツールです。
指定範囲がハイライトされますが今の所集計などの機能は無さそうです。
![screenshot_2021_07_03_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/5aaeb58d-5689-08f4-0eb3-bd4821830512.png)

# ・ キャプチャデータの見方
以下は1秒(1000ms)のサンプルデータです。
![screenshot_2021_07_03_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/ebd35255-eed2-d4fd-dc6d-46a345a6fd9a.png)

## CPU
Game ThreadやRender Threadを基準に拡大していくと以下のようにフレーム毎の処理が見えてきます。
今回の場合はそれほど重くないシーンなのでかなり余裕がありますが、CPU処理がネックになっている場合、この部分の内容が想定フレーム時間を溢れ出てしまうので、その場合は該当のCPU処理を確認することになるかと思います。
(Game ThreadとRender Threadのフレームがずれていることに注意が必要です)
![screenshot_2021_07_03_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/555a9258-a409-e38e-93fc-6f073dba813e.png)

## GPU
GPUの処理負荷を見る場合、各要素のカウンタなどを見ることになります。
GPUが重くなるよくある原因としては、アセットの頂点数が多いといったVertex起因、Textureが多い、サイズが大きいといったTexture由来の問題、特殊なシェーダーによりシェーダー負荷が高い、といった状況があるかと思います。

将来的に１フレーム内でのアセット(データなどを)みれるようになるようですが、現状は見れないので各信号を見て推測して治していくことになるかと思います。
（RenderDocを併用しても良いかもしれません。）
各カウンタについては以下ページにそれぞれのSoCによる情報がまとめられているので参照をおすすめします。
__Android GPU Inspector · GPU Counters__
https://gpuinspector.dev/docs/gpu-counters/


__※ GPUについては力尽きたので思いついたら追記します。__

テクスチャに関しては以下ページが非常に参考になりそうでした。原文を読んだほうが良いかと思いますがUE側でできる設定を含めて簡単に紹介します。
__Using Texture Counters in the Android GPU Inspector | by Francesco Carucci | Medium__
https://medium.com/@francescocarucci/using-texture-counters-in-the-android-gpu-inspector-7828c453b84a

### テクスチャに関する問題について

大きいサイズのテクスチャを大量に使用したり帯域を使いすぎることでボトルネックとなってしまう場合があります。
これらはテクスチャストール、キャッシュミスといった問題になり、以下のような問題点を回避することで改善できる可能性があります。
・非圧縮なテクスチャの使用
・Mipmapの未設定、不使用
・Anisotropicフィルタの多用

指標としてテクスチャがL1やL2キャッシュに存在しないキャッシュミスの割合が以下カウンタで確認できます。
これらは先程も紹介したページによるとL1キャッシュミスの平均は10％未満で、ピークは50％未満が望ましいようです。
__Using Texture Counters in the Android GPU Inspector | by Francesco Carucci | Medium__
https://medium.com/@francescocarucci/using-texture-counters-in-the-android-gpu-inspector-7828c453b84a
![screenshot_2021_07_03_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/c2139fea-af4c-8dfe-77e8-771a5547b37d.png)

#### ・Anisotropic filterによるテクスチャフェッチの割合
この値はAnisotropic filterによるテクスチャフェッチの割合を表しています。
![screenshot_2021_07_03_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/127327d4-5a6a-a197-af94-4f82ad13ad85.png)

テクスチャのフェッチの際に使われるanisotropic filterはモバイルで特に重くなる傾向にあるようです。
もし信号で高くでている場合、また不必要な場合はオフにして良いかもしれません。
各フィルターはTextureGroup毎に設定されているようなので、一括でオフにすることも可能です。
サンプリングに関わるので最終的な絵を確認しつつ調整することをおすすめします。
以下ページのEngine Config TextureGroup Propertiesあたりに設定例があります。
__Texture Support and Settings | Unreal Engine Documentation__
https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Textures/SupportAndSettings/#filtering

#### ・Base Mipmap以外が選択されている割合
この値はBaseのMipmap以外が選択されている割合のようです。負荷が高くこの値が低い場合はMipmapの設定を確認したほうが良いかもしれません。
![screenshot_2021_07_03_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/56571612-cff5-ba42-a901-1ba5d486278c.png)

UE4でMipmapを動作させるためにはテクスチャのサイズや設定に注意が必要です。

__・サイズ__
テクスチャが2の累乗の場合自動で作成されますが、それ以外の場合はMipmapの対応が行われません。
![screenshot_2021_07_03_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/0f9ae836-5fdd-d186-ab99-98c13f91073d.png)
__・設定__
TextureのTextureGroupがUIに設定されていたりNoMipmapが指定されていると常にmipが設定されないので注意が必要です。（最大解像度になります）
![screenshot_2021_07_03_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/9482f31d-621f-a01e-e60b-9b2cc30da108.png)

#### ListTexturesコマンドによる実機上テクスチャの確認
コンソールコマンドでlisttexturesを送信するとAndroid実機上でその時点で使用されているTextureのリストを見ることができます。
サイズ順に表示されるため、不必要なテクスチャなどが大きいサイズで転送されていないか確認します。
![screenshot_2021_07_03_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/e512f259-5ad0-e6a3-dca3-b2fe8f0eda49.png)

テクスチャに関する対応については以下資料が参考になりそうです。
__そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロファイル, Auto Instancing編>__
https://www.slideshare.net/EpicGamesJapan/ue4-festeast2019-ue4mobilepart2-179705328

----------------------------------

# AGIのTips

## ・端末接続時サーバーエラーのようなエラーが表示されて終了する場合
これはUSB経由で検証用Appをインストールできない時（権限がない）に表示されるようです。
1.1では対応端末でない旨が表示されます。

## ・ダークモード
UIをダークモードにできるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695861/173d237c-dc0d-94ce-2e2a-061061eebd3d.png)

# 参考リンク
__Using Texture Counters in the Android GPU Inspector | by Francesco Carucci | Medium__
https://medium.com/@francescocarucci/using-texture-counters-in-the-android-gpu-inspector-7828c453b84a
__Using texture counters with Android GPU Inspector - Android Game Dev Show - YouTube__
https://www.youtube.com/watch?v=Oeg5BskSjvw