UE最適化＆デバッグNightレポート

# はじめに
UENightはUnrealEngineのちょっとニッチな技術や機能について語り合ったり討論したりするイベントです。月に一度程度の間隔で開催しています。この記事は8/24に開催されたUE5 Debug&Tuning Nightのログです。
[開催場所のDiscordの招待リンクはこちら](https://discord.gg/dpK63k62)
初心者からガチプロまで誰でも参加可能です。

過去に開催されたお題
・GAS
・Rig
・最適化&デバッグ

※こちらのイベント/レポートの整合性,動作などの一切内容の保障は致しかねます

# 本編

### ドローコール数削減のために、MargeActorしたほうが良い？
・Instanced Static Mesh(ISM) を使用する。
ISM：同じStaticMeshが複数回描画される際に軽くなる。LODをインスタンス間で統一しないといけないなど一部難点もある。
 [Instanced Static Mesh UE公式ドキュメント](https://dev.epicgames.com/documentation/en-us/unreal-engine/instanced-static-mesh-component-in-unreal-engine)

・MargeActorしてしまうに個別に動かせなくなってしまうものの一応ドローコール数自体は減るので場合による？
[Unreal Engine - プロファイリング＆最適化の始め方](https://www.docswell.com/s/EpicGamesJapan/ZJDQ1Z-UE_profiling_and_optimization#p32)

・もともとのMaterial数が減らなければあまり削減は見込めない…？

・ドローコール数≒マテリアルセクション数なのでマテリアルスロットを減らす（マテリアルをまとめる）方向のほうが良い

・Material Instanceを使用すると同じシェーダーが使用されるため削減しやすい

・BPでプロシージャルに作成するようなActorはメッシュ1つ1つで個別にドローコールされてしまうのである程度見た目が決まったらMarge Actorしてしまったほうが良い

・Lyra Starter Game（公式のサンプル）でもプロシージャルな生成が取り入れられているが、StaticMeshに変換するボタンなどが取り入れられている。
[Lyra Starter Game マーケットプレイスページ](https://www.unrealengine.com/marketplace/ja/product/lyra?sessionInvalidated=true)

### 作成中に気にすべき重くなりがちな要素は？
➡Texture
・Textureは1024×1024が4枚より4096×4096が1枚のほうが重い（テクスチャは基本的に全体が読み込まれるため、時と場合による）2K以上は使用しないほうが良い？

・BaceColorは1024×1024だったとしてもラフネスなんかは512などで済ましてしまってもあり

・プラットフォームによってmaterialに対するTexture数に上限があったりする場合があるので要注意

### フォリッジの採用基準
・塗る感覚で置くもの（それこそ草木）に使用する。
・背景物に使用する
・インスタンスが効く（どうやらISMが使用される）ので多少早くなりはする
・あくまで編集ツール
・PCGで行っても同じことができる…はず？

### Textureの最適化について
・UEにはTextureに様々なプロパティがあるので要チェック
[Textureのプロパティ　公式ドキュメント](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/texture-properties?application_version=4.27)

・Texture Groupを設定しないといけない

・圧縮設定を使用用途ごとに変えないといけない

・[[UE4] Texture GroupがTexture Streamingに与える影響](https://qiita.com/EGJ-Nori_Shinoyama/items/8b3c2e4e372f05e33476)　CharactorやUI用などが設定できるTexture Groupについて

・Android系は端末の種類によって解凍できる圧縮形式が違ったり…
[テクスチャのフォーマットについて](https://effect.hatenablog.com/entry/2014/10/07/014037)　テクスチャの圧縮設定の種類

・sRGB/リニアなどのカラー設定は要確認

・Streamingを有効にすると見た目が変わったり部分的にしか読み込まれなかったりなどあるので要確認（基本的にDefaultでオン）
テクスチャのStreaming：テクスチャをだんだん読んだり遠くのTextureを低いMipで読んだりなど…（TextureのNanite見たいな機能）
[[UE] Virtual TextureとそのStreamingの仕組み、またよく頂く質問への回答](https://qiita.com/EGJ-Nori_Shinoyama/items/4a2e84dd1d3448e81bed)　Virtual Textureというテクスチャの一部だけ読み込む機能がある

・[UE4で作成するUIと最適化手法 【GAME CREATORS CONFERENCE '20】](https://www.docswell.com/s/EpicGamesJapan/KLG385-UE4_GCC20_UI_Optimize)
### Textureの設定で2の累乗のサイズにカリングするは効果がある？

・ある
・Mipがいらないのであれば2のべき乗でなくてもよい（小さいサイズの画像などで余りが出るなら…という場合）

### NaniteとLumenは重いと聞くがどうなのか
##### Nanite
・雑に入れてよい

・Materialでマスクをしていたりすると重くなる（葉など）

・不透明物は圧倒的に入れたほうがいい（透明物には使用不可）

##### Lumen

・重くなる

・Lumenを使う場合は必ずNaniteをセットで使用する（設定されていないと素のままのMeshにレイトレースなどが走り出してとても重くなったりする）

・そもそも30FPSをターゲットにしているのでゲームなどの60FPSを目指すもので使用するには重い

・LumenはLumen使用用のメッシュ構成しないといけない
パスの頭でメッシュカードを作成する（テクスチャ上にキャッシュする）　が６方向的な感じで撮影してライティングするため、斜めからしか見えない面などはブラックアウトしたりすることもある（らしい）
[UE5の最新グラフィクスを使いこなすためのN個の勘所 | EGC2024 (Yutaro Sawada & Nori Shinoyama)](https://www.docswell.com/s/EpicGamesJapan/5ENRE6-EGC2024_NGraphicsTips#p52)

### パフォーマンスを図るための自動化の取り組み（マップごとのFPSなどの自動化）

・Unreal Insightsを使用する　[[UE5] UnrealInsights を使ってみよう historia](https://historia.co.jp/archives/30687/)

・Studio Telemetry（UE5.4で追加）を使用するとログを送信できる？

・お手軽な事例としては「イベントを実行すると各レベルに勝手に遷移し、FPSなどを計測して後でそれをCSVとして書き出す」など

### Level InstanceやPacked Level Actorについて

・Level InstanceやPacked Level ActorはHLODに変換されて使用されるがLODがきちんと設定されていないと重い状態で複製されたりしてしまうなどの問題が起きることがある

・LevelInstanceに含まれるオブジェクトに、インスタンスごとの個別のパラメータを渡せない問題は5.5で解消される予定
[レベルインスタンスを作成する　公式ドキュメント](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/level-instancing-in-unreal-engine)
[Unreal Engine 5 ワールド パーティション HLOD のヒントとコツ](https://dev.epicgames.com/community/learning/tutorials/z050/unreal-engine-5-world-partition-hlods-tips-tricks　フォーラムチュートリアル)

・繰り返し使用するものはPacked Level Actorしたほうが良い

・LODごとにmaterialを設定できるので透明なものは遠くは不透明にするとよい

・LODが下がるごとにmaterial数を減らす設定もできる

### 再現が難しい/時間がかかるデバッグ作業はどうしている？

・オートパリイや敵全部倒すコマンドなどシステムに組み込んでします

・Pythonなどで動作を記録しオートプレイにする（仮想キーパッドみたいなAPIがある）

### スペック決め/動作検証はどうやって行っている？

・同じようなゲームを基準にする

・Androidの場合、最新バージョンがないとリリースできなかったりするため、そこからいくつ下げるかなど…

・[クラウド上で動くリモート端末サービス](https://appkitbox.com/guide_1/)

### Cheat Managerを使おう
PlayerControllerのCheatClassに設定することで使用可能になるデバッグ用コンポーネント。Shipping時に動作しなくなるのでShipping時のデバッグ用機能の切り忘れなどを防ぐことができる

・[[UE4] Define Console Commands Using CheatManager](https://colory-games.net/site/en/define-console-commands-using-cheatmanager-en/)
・[UE4 Cheat Managerを活用しよう](https://unrealengine.hatenablog.com/entry/2020/09/26/190000)
・[CheatManagerを使って開発専用のショートカットキーを管理する](https://www.hakobuneworks.com/posts/2024/08/25/)

### パッケージ化の種類を判別する方法

・Get Build Configuration というノードがありstring形式で判別することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870258/1a95545b-6fd9-7dc9-6d61-6d23312558fb.png)

・ｃ++であれば確実に取れる

### BluePrint Debuggerが便利
[【BP】Blueprint Debugger Window　Unreal Engine 5から始める C++ & Blueprint
](https://zenn.dev/posita33/books/ue5_starter_cpp_and_bp_001/viewer/chap_91_bp_blueprint_debugger_window)

処理が実行された順番や変数の値の確認などがランタイムに確認できる。

### フレームレベルで変化する変数の推移の確認

・Draw Debug～を使用する
[UE4: 点や線を簡易的に3D空間内へ描画する方法、あるいは UKismetSystemLibrary::DrawDebug 系の紹介](https://usagi.hatenablog.jp/entry/2017/12/21/083000)
文字や軌跡、図形などをLevel上に描画できる

・Rewind Debugerを使用する
[UE5 Rewind Debuggerを使ってみよう](https://unrealengine.hatenablog.com/entry/2022/05/29/234912)
[Rewind Debugger　公式ドキュメント](https://dev.epicgames.com/documentation/en-us/unreal-engine/animation-rewind-debugger-in-unreal-engine)
Animationのブレンドウェイトなどの情報を録画してタイムラインで確認できる公式プラグイン。コントロールリグやエイムなども確認できるよう


・Visual Loggerを使用する
[[UE4] Visual Loggerとはなんぞや。](https://historia.co.jp/archives/18769/)
[Using the Visual Logger](https://benui.ca/unreal/visual-logger/)
デバッグ用の図形やテキストを描画し、タイムラインで確認することができる。AIのデバッグに便利

・ｃ++を使用する
[UE4 デバッグ表示についてのメモ](https://qiita.com/unknown_ds/items/759edd4c8b93ad1977cc#canvas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E8%A1%A8%E7%A4%BAc)

### UEのShader complexityが便利

[[CEDEC2017] UE4プロファイリングツール総おさらい（グラフィクス編）](https://www.slideshare.net/slideshow/cedec2017-ue4/79305388)
ビューモードで切り替えできる。ライトの複雑さやシェーダーの複雑さなどが確認できる。
（最近あてにならないらしい？）

### NaniteのSkeletal Mesh

5.5から対応される…らしい？

### Actor Coloration機能

[猫でもわかるUE5のActor Coloration機能](https://www.docswell.com/s/leon-gameworks/K1JDQG-UEMConnect_008)
特定の条件を見たいしているActorを色付けして判別しやすくする機能

### 現在開いているウェジットを調べる方法はあるか？

・Widget Reflector
[[UE4] Widget Reflectorを使ってリソースや設定を調べよう](https://qiita.com/EGJ-Ken_Kuwano/items/523c97697563751bcc71)
UEのすべてのUIが格納されている階層構造を見れる
フォーカスされている場所などを確認することができる。ブラウザの開発者には見覚えがあるやつらしい


### その他上がっていた資料
[Optimizing the Game Thread | Unreal Fest 2024](https://youtu.be/KxREK-DYu70?si=_eZr_zf8sST6ylqc) Epicの最適化についての講演
[[UE5] レベルを整理するEUWを作成しよう！](https://historia.co.jp/archives/33320/)
[テクスチャも含むゲームの仕組みの勉強にお勧めの本](https://www.amazon.co.jp/dp/486246467X?ref=cm_sw_r_cp_ud_dp_KPB5PCMJ3DAAKH0N4FTT&ref_=cm_sw_r_cp_ud_dp_KPB5PCMJ3DAAKH0N4FTT&social_share=cm_sw_r_cp_ud_dp_KPB5PCMJ3DAAKH0N4FTT&skipTwisterOG=1)