[UE4]UnrealInsightsとログ表示

UnrealInsights使ってますか？
4.23から追加された機能なのですが、めちゃんこ良いツールなのでバンバン使っていきましょう！
特に強いプロファイラーの無いプラットフォーム向け開発に強い味方になってくれます。

#2020/6/11追記
エピックゲームズジャパンオンラインラーニングシリーズのUnrealInsightsの解説が公開されました。
非常に広範にわたってUnrealInsightsの解説がなされておりますので是非ご参照ください。

[UE4.25 Update - Unreal Insights -](https://www.docswell.com/s/EpicGamesJapan/ZGLNJ5-UE4_UnrealInsights_UE425)

#準備

UnrealInsightsはリリースされたばかりなので簡単に起動までを簡単におさらいします。

https://docs.unrealengine.com/ja/Engine/Performance/UnrealInsights/index.html

まず
**VisualStudioでエンジンのソリューションを開き、UnrealInsightsをビルドする**
これが重要です。

ビルドが成功すれば `Engine/Binaries/Win64/UnrealInsights.exe` ができているはずなのでいつでも起動できるようにショートカットを作っておくのをお勧めします！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/4d3f776c-9eb1-2076-c5e3-6e767f59c1b6.png)


#起動
ビルドが終わったら大きく2つの方法でキャプチャーをとります

## 4.25での変更点(重要)
**4.25からデフォルトではログが出力されないようになっています。**

UnrealInsightsへの出力データはカテゴリごとにTraceChannelに分類されており、
どのTraceChannelを有効にするのかをコマンドラインオプションで指定する必要があります。
Logも一つのチャンネルに割り当てられており、デフォルトでは無効になっています。

cpu,loadtime,logを有効にする場合は

```
-trace=cpu,loadtime,log
```

のような形で-traceオプションの引数として入力します。

##ホストPC上でUnrealInsightsを動かしアプリから通信をつかって出力

1. ホストPC上でUnrealInsightsを起動しておく
2. エディタからスタンドアローン起動する場合、スタンドアローン起動のコマンドラインオプションに`-cpuprofilertrace`を付けて起動する。<br>ウィンドウズ向けの非ShippingビルドはIPを指定しなくても同一PC上のUnrealInsightsに接続を試みてくれます。
3. パッケージしたゲームなどもtcp接続が可能な環境であれば `-tracehost=ii.pp.aa.dd -cpuprofilertrace` をコマンドラインオプションに渡せば接続可能です。

##自分でファイルを出力する

-tracefile=ファイルパス を使ってローカルにファイルを生成することも可能です。

#さて本題

UnrealInsightsは起動時からすべてをファイルに保存しているため、横に長くなってしまします。
この中から見たい位置をマウスなどでぐりぐりと探すのは時間がかかります。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/7078f190-8c1e-5df3-f202-a34f9bdc6ccf.png)

しかし！ブループリントなどで出力されるログがInsightには含まれています。これをタイムライン上に表示できるのです
**ここでおもむろにキーボードのMを押しましょう！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/bb19dad6-5538-5b06-6ce2-3b74f857b344.png)

タイムラインの上に文字列が並んだ行が追加されます。
ログを出力したタイミングで線が引かれていて、見たいところが非常にわかりやすくなります。
画面下部のログ表示タブ上からログを選んでクリックすることタイムラインをジャンプすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/c7b2c288-6386-c8b0-79dc-0b9cc05b0861.png)

#(余談)AndroidでInsightを使う(UE4.24以降)
プロファイラでいろいろ苦戦してしまいがちなAndroid向けビルドにもInsightが役立ちます！
いろいろな方法でInsightを利用可能です。

https://docs.unrealengine.com/ja/Support/Builds/ReleaseNotes/4_24/index.html

> Improvement: Enabled event tracing (such as Unreal Insights) on Android, iOS, Mac, Linux, and Switch.

Androidは4.24から利用可能です!

##1.USB接続を介して通信する
公式ドキュメントの下の方に記載があります。
https://docs.unrealengine.com/4.27/ja/TestingAndOptimization/PerformanceAndProfiling/UnrealInsights/Overview/#android
adbのreverseコマンド(逆ソケット)をつかってデバイス内の通信をホストPCに流すことができます。

```
adb.exe reverse tcp:1980 tcp:1980
```

デバイスに対して1980ポートで通信を行うとadbがそれをホストPCの1980に流してくれるわけですね。
CommandLine引数は`-tracehost=127.0.0.1 -cpuprofilertrace` でOKです。
この逆ソケットを応用すれば「localhost指定でホストPC上のDedicatedServerに接続させる」みたいなこともできそうです。

##2.Android上でTracefileを使ってローカル出力
tracefileオプションを使うことでデバイス上のストレージにファイルを出力することもできます。
**非力なデバイス上で大量の情報をファイルに出力しようとすると、それ自体が負荷になってしまう** こともあるので
デバイスに合わせて選択してください。

##3.Androidとadbを介してワイヤレス接続する
同一LAN内にHostPCとAndorid端末が接続できていればホストPCのIPAddressを指定することでもホスト上のUnrealInsightsと接続ができます。

adbで接続しながらローカルネットワークで通信する場合、adb connectによってwifi越しにadb接続をする方法もありますので紹介します。(検証中に見つました)
https://developer.android.com/studio/command-line/adb#wireless
**大雑把にいうと、通常通りUSBで繋いだ後`adb tcpip 5555`を入力してワイヤレスadb接続を有効化し、`adb connect device_ip_address` が受け入れられればUSB接続無しでadb接続が可能です。**

ホストPCと同一サブネット内にあるなら、UE4CommandLine.txtにホストPCのアドレスを含めて `-tracehost=ii.pp.aa.dd -cpuprofilertrace` を追記したあとに起動すれば接続できます。
UE4CommandLine.txtについてはこちらのドキュメントが詳しいです。
https://wiki.unrealengine.com/Command-Line_Arguments_on_Mobile

ホストのIPを記述するのは面倒ですがケーブルを刺さなくていいのは取り回しが楽でいいですね。

↓成功するとこのような形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/521a0aeb-7037-635e-8e6b-5a03573d110a.png)


#まとめ

とても軽くて便利です！特にPC向けやモバイル開発の際に強い味方になってくれます！
是非活用してください！