UE5 + ADX でサウンドをプロファイリングし、処理負荷を調べる

# はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではアンリアルエンジン5とサウンドミドルウェア「ADX for UE」を連携させて使った際の、様々なプロファイリング機能の使用法についてまとめています。
普段からサウンドのパフォーマンスを意識することは少ないかもしれませんが、一度開発中のゲームサウンドについて確認してみるといいかもしれません。

![A00B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/69e0630c-d1c0-ad15-5f62-a4c202434031.png)
（こちらの画像のみUE4での画像ですが、プロファイリングはUE5でも同じように可能です）

本記事ではUE5の実行中に使用できるコンソールコマンドでのデバッグ・プロファイリングと、AtomCraftを連携させて行う「インゲームプレビュー」について解説します。


UE5.3+「ADX LE UE SDK(2.01.00)」を使用します。
基本的にブループリントのみでの実装を想定しています。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/


# 前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a
ADX for UEの導入で、一歩上のサウンド表現を（実践編）
https://qiita.com/SigRem/items/c089b71c42e898980a46

# UE5上でプロファイリング

UE5上では、実行中のゲームを動かしながら場面場面についてのプロファイリングを行うことが可能です。
標準機能としても、コンソールコマンド（「stat unit」など）や「Unreal Insights」を使ったプロファイリング機能が提供されています（こちらは主にグラフィックやロジックなどの負荷を確認するものです）。
コンソールコマンドを呼び出すには、キーボードの「@」キーや「~（チルダ）」キーを使用します（UEのバージョンによりキーが異なることがあります）。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/eca62a74-f49e-0f93-69aa-3b83cc4bc0c9.png)

![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/79f34801-2704-fc28-7471-19bc0843348c.png)


## リスニング位置の確認
音源やリスニング位置は、コンソールコマンドを使用することで視覚化することができます。
ADX for UEで使用できる、主なコマンドを紹介します。


### ビジュアライズを開始し、サウンドを視覚化する
「**atom.3dVisualize.Enabled 1**」を入力すると、再生中のキューの位置が視覚化されます。
![B00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/559fc9d8-580c-0208-574b-fed110897976.png)
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ce6f3c4e-e517-8a85-999e-c9f2bcac227e.png)
キュー名や音量が表示されます。音量以外の情報については、次のコマンドで参照できます。

### ビジュアライズのモードを設定する
「**atom.3dVisualize.ActiveSounds**」コマンドでは、コマンド後に付加する値によって「**atom.3dVisualize.Enabled**」コマンドの視覚化情報が変化します。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/66a9baa3-a97b-712a-d91f-7f7a6561da4a.png)


### リスナー（サウンドを聞き取る位置）を視覚化する
「**atom.3dVisualize.Listeners 1**」コマンドは、サウンドを聞き取っている位置（通常はカメラ位置）が視覚化されます。サウンドの聞こえ方がおかしい場合、こちらを確認してみるといいかもしれません。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1ec48be7-e427-59ff-fd79-2573624d19ba.png)


### 再生中のキューをリストアップする
「**atom.Debug.SoundCues**」を使用すると、再生中のキューのリストがビューポート上に表示されます。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/4bace309-50ed-1c7f-aa1b-d3869a6d715a.png)



これらのコンソールコマンドとレベルブループリントを使用して、ワンタッチでデバッグできるような機能を作ってみましょう。

「Open Level Blueprint」からレベルブループリントのエディタを開きます。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/13e46045-36e0-f6db-dd6f-ab76c911d99e.png)

コンソールコマンドをブループリントから使用するには、**Execute Console Command**ノードを使用します。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9901b0c1-53df-2077-348e-980065ad6ea9.png)

音声のリスニング位置を描画するには、「**atom.3dVisualize.Enabled 1**」を入力します。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7c0db633-9841-1397-d0d6-5b8e87f661f7.png)

逆に描画を無効化するには、「**atom.3dVisualize.Enabled 0**」とします。

キーボードの任意のキーを押したらコンソールコマンドが実行される処理を書きます。
**Input Key 2**でキーボードの「T」キーが押されたことを感知します。
**FlipFlop**は実行されるたびに「A」と「B」の分岐を行き来するノードです。
次の画像ではキーが押されるたびに、再生中のキューの描画がオン/オフされることになります。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/671cc9f5-9cd0-4c39-896c-bda7f963f550.png)

ゲームを実行し「T」キーを押してみると、再生中のキューが視覚化されます。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9f8cccaf-c2dc-f9f3-b292-455602f2a794.png)

ビューポートから再生している場合「F8」キーを押すことで俯瞰視点でシーンを見ることができます。
他のコンソールコマンドも同じような処理を使って使用することが可能です。

**MultiGate**ノードを使って、キーを押すごとに「**atom.3dVisualize.ActiveSounds**」コマンドのモードを切り替える処理の例です。
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7b13c0ad-e7b6-74b9-5acb-e01cf8a23ff0.png)
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/855392b0-29bb-a95a-7b6b-53725b5ec7dd.png)



## メモリやパフォーマンスの確認
ゲーム実行中のパフォーマンス状況を確認するコマンドもあります。
こちらは直接コンソールコマンドとして入力してしまいましょう。

パフォーマンス確認のためのコンソールコマンドは「**Stat CriWare**」です。
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e1da0ef5-9b7c-7ce3-6f12-f6e1f1d1925d.png)

コンソールコマンドを入力して「Enter」キーを押すと、パフォーマンス使用状況が画面上に表示されます。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7980f818-ae8c-0463-d1de-8a03e2f24105.png)
メモリの使用状況・使用容量などが確認できます。




# インゲームプレビュー
サウンドオーサリングツール「AtomCraft」と連携した詳細なプロファイリング機能、「インゲームプレビュー」も使ってみましょう。

## UE5側の準備
インゲームプレビューを使うには、UE側でプロジェクトの設定をする必要があります。
ツールバーの「Edit」→「Project Settings」からプロジェクト設定を開きます。
![E01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/82a58583-4bfe-2713-2464-d20756cd226b.png)

「CriWare」タブの「Use In Game Preview」にチェックを入れます。
![E02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e3e75225-2e7b-3007-1c22-661c8ab52ebe.png)


## キューシートのビルド
インゲームプレビュー用に改めてキューシートをビルドする必要があります。
AtomCraftでプロファイリングしたいプロジェクトを開き、
ツールバーの「ビルド」→「Atomキューシートバイナリのビルド」を選択します。
![E03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6d55855a-05a2-85a7-e33a-de25cf095076.png)

キューシートのビルドをするウィンドウが開くので、書き出したいキューシートを選択し、下部の「インゲーム用バイナリを出力」にチェックを入れてビルドします。
![E04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d18bb80f-8599-f56a-1f07-d7dc01a047eb.png)

エクスポートしたフォルダに「inGamePreview」というフォルダが追加されているので、中に入っているacbファイルをUE5にインポートします。
![E05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8d6d80d2-474f-9bea-1d5f-5c1f94993232.png)
![E06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3058f2c3-090a-244a-e15d-3325afc6c6cb.png)


## インゲームプレビューを開始する

AtomCraftでインゲームプレビューを開始します。
まずはプロジェクトツリーの「ターゲットコンフィグ」にある項目を右クリックし、プレビュー設定を編集を選択します。
![E07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/36a94afd-310b-0d51-daae-8b6d3be28e3f.png)

編集ウィンドウが開くので、「編集」ボタンをクリックします。
![E08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c307e7c1-5a5b-b311-e712-4cc0d593e571.png)

プレビュー時に使用するIPアドレスが指定できます。
ローカルでテストする場合、「内部プレビューアを使用してプレビュー」にチェックを入れておきます。
![E09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/5e0c6c96-8f3c-57fd-2cb8-dab7145cb7cc.png)


UE5側でゲームを実行します。インゲームプレビューを使用する場合「Standalone Game」を選択してスタンドアローンモードで起動します。
![E10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/87c1a5c9-3463-7c70-db32-00ffece5c144.png)
新しいウィンドウで立ち上がります。
![E11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d12ff48e-498e-017a-cd20-1328fcc563eb.png)

AtomCraft側では、ツールバーの「プレビュー」→「インゲームプレビューの開始」を選択します。
![E12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/86aaf423-4502-2173-e054-79418b0e7137.png)

正しく接続できていればプレビュー情報に再生されているキューシートがリストアップされます。
![E13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/e6a8ccb7-cf15-8814-0cba-61cd8c07bee8.png)

もし接続がうまくいかない場合、ログを参照してみてください。
また、ADXプラグインとAtomCraftのバージョンが対応しているものか確認するのも重要です。

## プロファイラーを使用する

インゲームプレビューが開始できたら、「プロファイラー」機能で詳細な状況を調べることができます。
ツールバーの「表示」→「プロファイラー」を選択します。
![E14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ee0a2cc7-3f0d-8724-842c-08a55e3071f7.png)

プロファイラーウィンドウが表示されます。
左上の「Start」ボタンを押すと、ゲームの実行状況に応じてログが更新されていきます。
新しくキューが再生されるたび、タイムラインに現れていくはずです。
![E16b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/9a75bdac-ec4a-d6df-ab12-8a885d04f750.png)
画像は「Cue_BGS_Jungle」と「Cue_BGS_Fire」について二度再生を停止し、数秒おいてから再び再生したものです。キューを再生している間のみ色がついていることがわかります。


各項目で再生されたキューの履歴やパフォーマンスへの影響、音量のピークなどが確認できます。
各項目の設定ウィンドウで、表示される情報の絞り込みが可能です。
![E16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/f8b514c1-a687-11c7-e496-5502e0c2fdce.png)


インゲームプレビュー、プロファイラーを使用すればサウンドの状態が視覚的に分かりやすく、かつ膨大な情報を管理することができます。
設定したサウンドが正常に再生されているか、またサウンドの遷移が意図した動きをしているかなど、詳しく調べてみたい場合に重宝します。
快適なユーザー体験のためにも、一度確認してみてはいかがでしょうか。



## 新バージョンで追加されたプロファイリングツール

ADX for UEの新バージョンでは、UEのエディタから起動できる新たなプロファイリングツールが登場しました。
いずれもツールバーの「Tools」から呼び出すことができます。
ゲームを再生した状態で使用してみましょう（こちらはPlay in Editorモードでも動作します）。

### Atom Monitor

「Atom Monitor」は「START」ボタンを押してから「STOP」ボタンを押すまで、ログとしてキューの再生やパラメータの変化をモニタリングすることができます。
![F01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a85d9faf-cd44-8568-d2b8-9fd460ef5556.png)
![F02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/90310ce0-46ae-a0bc-6676-8ae766758960.png)

### Atom Resource Usage

「Atom Resource Usage」はキューシートの仕様状況を監視します。
画像ではロードされているキューシートがリストアップされています。ここで表示されているキューシートが多すぎる場合は、シートの統合・分割やロジックの改善を考えてみても良いかもしれません。
![F03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/c871beaf-3256-9938-227b-99904d2b38f1.png)
![F04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/06026804-219f-56e6-1de4-e3b0978ed66a.png)

### Atom Statics
「Atom Statics」ではキューやリスナー、発声など「ADX for UE」に付随する要素をまとめて監視することができます。
![F05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3a39df10-a229-03b3-7a04-f03d35f5881a.png)
![F06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7a87bdec-1dc1-1fc2-ddef-75cdb121c43b.png)