ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4 & iOS開発時の実機デバッグ・プロファイリング方法 まとめ 2018 < CPU・GPUプロファイリング編 >

本内容は複数の記事で構成されています。検索などでこの記事に直接飛んできた方はまず以下の記事をご確認ください。
pafuhana1213.hatenablog.com

はじめに

みんな大好きプロファイリングについての話です。
iOS開発では、Instrumentsというプロファイリング用のツールが用意されています。ここではをUE4で開発をする際にどのようにしてInstrumentsを使うかについて説明します。

…実機上で各statコマンドを活用することもお忘れなく。

www.slideshare.net

Instruments起動前の前準備

dSYMの生成

Instrumentsを使うためには、dSYMと呼ばれるデバッグシンボルが必要です。UE4の場合は、プロジェクト設定のiOS/Buildにある “Generate dSYM file for code debugging and profiling”を有効にする必要があります。
このフラグを有効にするとビルド時にdSYMを生成してくれます。しかし、その分ビルド時間が長くなってしまうため、デフォルトでは無効になっています。ちなみに、dSYMは “[Project Root]\Binaries\IOS”以下に生成されます。
f:id:pafuhana1213:20181213025621p:plain

プロファイリング対象のアプリを実機上で起動

Instruments起動後でもいいのですが、ついつい後述のプロセス設定を忘れがちなので、僕はここでアプリを起動しています。起動方法に関しては制約はありません。iOS端末から直接起動してもいいですし、Xcodeから起動しても問題ありません。ただデバッグすることを考えると、Xcode経由の方がいいかなとは思います。

Instrumentsの起動

まずはXcodeのメニューからInstrumentsを起動します。なお、起動後にInstrumentsをDockに登録しておくと次回以降の起動がXcodeなしで出来るので楽になります。
f:id:pafuhana1213:20181213025728p:plain

Instumentsを起動すると、以下のようなウィンドウが開きます。Instrumentsではプロファイリングする項目を選択できるようになっています。ただその項目の量が結構多いため、それらの項目が用途別にまとめられたテンプレートを選択する形になっています。
f:id:pafuhana1213:20181213025751p:plain

developer.apple.com

そして、UE4を使った開発の場合、主に使うテンプレートは以下の3つかと思います。ただ他にも色々項目があるので、軽く見ておくのも良いかと思います。(ただし、iOSでは非サポートの項目もあるのでご注意を)

  • Time Profiler
    • Game threadのプロファイル
    • オーバヘッド:小
  • Metal System Trace
    • Game, Draw, GPU threadのプロファイル
    • オーバヘッド:中
  • Game Performance
    • Game, Draw, GPU thread + Memory管理 のプロファイル
    • オーバヘッド:大

また、表示されたウィンドウの上部にはプロファイリングを行う端末・プロセス名が表示されます。もし意図する対象とは異なる場合はクリックして変更しましょう。

Instrumentsの実行…前の準備

dSYMの配置場所の指定

テンプレート選択したので早速プロファイリングしたい所ですが、まずはInstrumentsのPreferences->Symbolsに、UE4が生成したdSYMがどこにあるのかを設定する必要があります。この設定をしなかった場合、Time Profilerにおける処理項目名がよく分からない文字列になるのでご注意下さい。
f:id:pafuhana1213:20181213030042p:plain
f:id:pafuhana1213:20181213030057p:plain

一応、あとでdSYMを直接指定することも可能です。具体的には、InstrumentsのFile->SymbolsからdSYMに関する情報を確認・変更可能です。

stat namedevents コマンドを実行

Instrumentsによるプロファイリング結果を正しい形で見るために、アプリ起動後に “stat namedevents”コマンドを実行する必要があります。このコマンドを実行しなかった場合、dSYMを指定しなかった場合と同様に、プロファイリング結果をまともに見ることができなくなるためご注意下さい。

ちなみに、他の外部プロファイリングツールでも同様です。stat namedeventsコマンド、大事です。

Instrumentsの実行

ようやく準備が整いました。これでInstruments左上の録画ボタンを押すことでプロファイリングが開始し、もう一度押すと終了します。ちなみに、下の画像はGame Performanceテンプレートを使用した際のプロファイリング結果です。
f:id:pafuhana1213:20181213030225p:plain
それぞれの項目について細かく解説するといつまで経っても終わらないので、ざっくり説明します。

Time Profiler

今回紹介したテンプレートは全てTime Profilerテンプレートを内包します。で、Time Profilerの結果が見れるのがこの CPU Usageです。指定した範囲における各処理の負荷・呼び出し回数などを確認可能です。GameThreadがボトルネックになっている場合、この情報が役に立つ可能性が高いです。
developer.apple.com
f:id:pafuhana1213:20181213030317p:plain

ただ少し注意しないといけないことが幾つかあります。
まずは、UE4以外の処理も抽出されてしまう点です。フィルタを適用しない場合、以下のようによく分からない処理が大量に並びます。
f:id:pafuhana1213:20181213030338p:plain

これでは調査に支障が出てしまうため、Instrumentの左下にあるInput Filter機能を活用します。ここにある [ IOSAPPDelegate MainAppThread ]を選択することで、UE4関連の処理だけを表示するようになります。
f:id:pafuhana1213:20181213030407p:plain

次に、同じくInstrument左下にあるCall Treeにおける”Hide System Libraries”は必ず有効にしましょう。
f:id:pafuhana1213:20181213030558p:plain

有効にしない場合、以下の画像のように項目名が解読不能になってしまいます。
f:id:pafuhana1213:20181213030619p:plain

Call Treeには他にも調査する上で便利な項目があるので、一度試してみましょう!

Displayed Surfaces

Metal System Trace, またはGame Performanceテンプレートに含まれます。この項目ではVsyncのタイミングを確認する事が可能です。それだけの項目なので、他の項目と併用することになります。例えば、Time Profilerでだいたい1フレームにおける負荷を見たい場合は、このVsyncタイミング情報は非常に有用です。
developer.apple.com
f:id:pafuhana1213:20181213030753p:plain
f:id:pafuhana1213:20181213030812p:plain

Graphics Driver Activity

Metal System Trace, またはGame Performanceテンプレートに含まれます。この項目では、描画に関するCPU側のイベントを確認できます。ただGPUフレームキャプチャのように詳細は見れません。どの処理がどの程度負荷があったのかを確認する程度です。
developer.apple.com
f:id:pafuhana1213:20181213030915p:plain

GPU Hardware

Metal System Trace, またはGame Performanceテンプレートに含まれます。この項目では、描画に関するGPU側のイベントを確認できます。具体的には、頂点・フラグメントシェーダにおける負荷を確認可能です。ただし、先程と同様に詳細(使用されたテクスチャ、どのようなメッシュが描画されたかなど)は全く見れません。
developer.apple.com
f:id:pafuhana1213:20181213030959p:plain
f:id:pafuhana1213:20181213031010p:plain

最後に

ここまでがCPU, GPUプロファイリングについてでした。CPUプロファイリングに関してはUE4エディタのCPUプロファイラでもある程度代用可能ですが、オーバヘッドのことを考えるとInstrumentsを使用した方がより高精度なチェックが出来るかと思います。

またGPUプロファイリングに関しては、説明にあったとおりGPUフレームキャプチャのように各処理の詳細は見れません。しかし、どの項目がボトルネックになっているのかを調査するのには非常に適しているかと思います。Instrumentsでボトルネックを確認してから、GPUフレームキャプチャで詳細確認する流れが良いかと思います。

まとめページに戻る
pafuhana1213.hatenablog.com