【UE5】Niagaraの負荷計測と高速化のTips

今回はNiagaraの負荷計測や高速化を行うアプローチについて解説したいと思います。

1. まず「エフェクトが本当に重いのか」を確認する

最初に「そもそもエフェクトは重たいのか?」ということを確認します。

Unreal Engineには描画をON/OFFするコンソールコマンドが用意されています。

  • show particles
  • show niagara

基本的にどちらも同じ挙動で、これを実行することで Niagara を非表示/表示できます。

次に stat unit または stat unitgraph で負荷計測を行います。

stat unitは数値のみですが、stat unitgraphではグラフ表示できます。

stat unitの項目説明

stat unitコマンドで表示される項目の説明は以下のとおりです。

項目名意味測定対象詳細説明/負荷の原因
Frameフレーム全体の処理時間 (ms)全体 (平均値)この値が 16ms を超えると 60FPS 未満となります
GameGame Thread の処理時間。ロジック・AI・物理・Niagara CPUSimなどCPU (ゲーム側)ブループリント、Tick、Niagara CPU、AI、物理計算などの過剰負荷
DrawDraw Thread (レンダリング準備) の処理時間CPU (描画命令組み立て)ドローコール数、マテリアル複雑度、メッシュ数、インスタンス化不足など
RHITRHI Thread (GPUコマンド送信) の処理時間CPU→GPU間ドローキュー詰まりやレンダーリソース更新コスト
GPU TimeGPU 側で実際に描画に要した時間 (ms)GPUピクセルオーバードロー、ポストプロセス、Niagara透過、ライティング負荷など
Input入力処理 (ポーリングやイベント) に要した時間CPUコントローラ入力など
Memメモリ使用状況の概要(RAM, VRAM, StreamingPool など)CPU/GPUStreaming Pool Overflow, テクスチャ/メッシュ読み込み過多など
DynResDynamic Resolution のスケール値GPUGPU負荷を下げるために自動でレンダー解像度を下げている比率(例: 0.8)
Draws1フレームあたりのドローコール数CPU→GPUInstancingやMesh Mergeで削減可能です
Prims1フレームあたりに描画されたポリゴン (プリミティブ) 数GPULODや距離カリングで削減できます

2.「どのエフェクト」が重いのかを特定する

シーン全体で処理が重い部分を洗い出せたら、エフェクト単位で負荷を比較します。

可能であれば特定のエフェクトを非表示/表示するデバッグ用機能を作ると便利です。もしそれを作るのが手間であれば専用のレベルに特定のエフェクトをたくさん並べて検証しましょう。

そして再び stat unit / stat unitgraph で負荷を検証してみます。

3. エフェクトのどの処理が重いのかを特定する

重たいエフェクトが特定できたら、その内部処理のどの部分が負荷となっているかを検証します。

CPU/GPUどちらがボトルネックなのか?

stat unitで CPU/GPUのどちらに時間が偏っているのかを確認します。

このとき、エフェクトの "Sim Target" の設定を "CPUSim" / "GPUCompute Sim" のどちらに切り替えて違いを比較するという方法もあります。

ポストプロセスや半透明の影響を除外してみる

show postprocess でポストを無効にすることができます。また show translucent では半透明の絵強を除外できます。エフェクトでは基本的に半透明や加算ブレンド処理が多く使われるので、show translucent で確認するのは重要です。

マテリアルのBlend Modeを "Opaque" にしてみる

マテリアルが重たいかどうかを調べるときに、Blend Mode を "Opaque" にしてみるという方法も場合によっては有効です。

なおマテリアルインスタンスでプロパティをオーバーライドしている場合はこちらも修正する必要があります。

パーティクル数の管理

パーティクル数が増大する原因の多くが「Spawn Rate (発生率)」と「Lifetime (寿命)」です。これらを増やすと見栄えはリッチになりますが、パーティクル数の増加により処理負荷が上昇します。

ただ単に減らしてしまうと見栄えが悪くなりやすいので、エフェクトデザイナーなど関係各所に相談しながら適切な値に設定していきます。

4. Maskedマテリアルを軽量化する

NiagaraでMaskedマテリアルを使う場合、描画コストが高くなりやすいです。その理由がSpriteRendererの「オーバードロー」です。

SpriteRendererは通常四角ポリゴンを使って描画を行うため、テクスチャの抜き色に対してもピクセルシェーダーは実行されてしまうため、GPUコストが発生します。

1). まずは Cutout (カットアウト) で軽量化できるかチェック

このオーバードローによるGPU負荷が発生しているかどうかを検証するには、まずは "Cutout (カットアウト)" を試すと良いです。

Cutoutとは、抜き色を考慮して動的に生成したメッシュに置き換えることでオーバードローを回避する仕組みです。

設定は Sprite Rendererのカットアウト > "Use Material Cutout Texture" です。

CutoutによってGPU負荷が大幅に削減するのであれば「オーバードローの負荷が高い」と言えます。

2). 専用メッシュを用意する

ただ Sprite Rendererの Cutout 機能は「動的にメッシュを生成する」ため、パーティクル発生時に大きな負荷がかかります。

そのため Cutoutの効果が確認できたら、専用の静的なメッシュを作成しておき、メッシュパーティクルにすることをおすすめします。

5. Early Z-pass (早期Zパス) の活用

Maskedマテリアルを使用している場合、BasePassでもピクセルシェーダー計算が行われるため、Depth Testよりも前にGPUコストが発生してしまいます。

これを回避するのが Early Z-pass (早期Zパス) で「エンジン > レンダリング > 最適化」にその設定があります。

Early Z-pass (早期Zパス) を有効にすると、Early Z-pass の計算誤差により距離が近接するパーティクル同士のアーティファクト(欠け)が発生する可能性がありますが、環境によっては試しに有効化してみる価値はあるのではないかと思います。

おしまい

以上、Niagaraの負荷計測・高速化Tipsでした。

負荷計測には Unreal Insights を使う方法もありますが、今回はお手軽に計測を行うTipsの紹介でした。

この情報が、Niagaraの高速化のお役に立てれば幸いです。

\ 最新情報をチェック /