今回は、CEDEC2025で紹介されていた、複数の同じNiagaraSystemを1つにまとめることで処理負荷を下げる対応について実装検証を行います。
講演では、同じNiagara Systemを複数設置する場合、1つのシステムにまとめることでEmitter数を大幅に削減できるそうです。この手法は、Emitter数が多いほど効果的であり、CPU負荷やDraw Callの削減に繋がります。
鉄拳8の資料によると、対策を行うことで約12個のEmitterを1つに統合した場合、負荷が約2倍近く削減されています。
作成方法
◇ User Parameterの作成
今回の例では、SpawnRateを使用しているEmitter(Fountain)を題材にします。
Niagara System「Fountain」にUser Parameterを作成します。
-
Parameter Type:
Vector Array
を使用してください。 - 適用したいパラメータが増えた場合は、ここに追加で
Vector Array
を作成します。
◇ Moduleの作成
今回は2つのModuleを作成します。
- Niagara System用モジュール(配列サイズ取得)
- Niagara Emitter用モジュール(Spawn Rate改造)
⚠️ 注意
Module作成時は、Editorの言語設定をEnglishに変更してください。日本語UIでは一部ノードが検索できない場合があります。
■ 配列サイズ獲得モジュール
User Parameterに登録した配列の長さを取得し、Systemに渡すモジュールです。
-
処理内容
- モジュール入力に
Vector Array
を登録 -
Length
ノードで配列の長さを取得 -
MapSet
でSystemに値を保存(Emitterで利用可能になる)
- モジュール入力に
■ Spawn Rate改造モジュール
次に、既存のSpawn Rate Moduleを複製・改造します。
-
手順
- Engineフォルダ内の
Spawn Rate Module
を複製 - Spawn Rate処理部分に
Vector Array
を入力として追加 -
Length
で配列のサイズを取得し、Spawn Rateに反映
- Engineフォルダ内の
→ これにより、配列の数が増えてもエフェクトが薄くならず、各配列位置に均等にパーティクルが生成されます。
◇ Niagara Systemへの適用
■ システムにモジュールを追加
作成した「配列サイズ獲得モジュール」をSystemのSpawn部分に追加します。
追加後、User Parameterの値を指定してください。
■ EmitterのSpawn Rate差し替え
Emitter(Fountain)の既存のSpawn Rateを、作成したSpawn Rate改造モジュールに置き換えます。
置き換えたら、User Parameterから配列長を渡してください。
◇ Partition Particleモジュールの追加
次に、Emitter内部でパーティクルを分割・グループ化するためのPartition Particleモジュールを追加します。
これにより、複数Emitterを使うよりもパフォーマンス改善が見込めます。
-
設定例
- Partition Mode:
Sequential
- Count Mode:
Fixed
- Number Of Partitions:
Position Array Length
(配列サイズを利用)
- Partition Mode:
◇ Init Position処理への適用
最後に、Init位置の設定でUser Parameterの配列を参照します。
-
Position Offset
-
Select Vector from Array
を使用 -
Direct Array Index
→Partition
-
Vector Selection Array
→ User Parameter
-
これらの設定をし、UserParameterのVector Arrayの配列を増やすことで、Foutainの数を増やせると思います。
UserParameterはBPやC++で値を操作することが出来るので、BPでVectorArrayの値をいじって1つのNiagaraのインスタンスで複数のエフェクト配置ができるなど効率的に配置が出来そうです。
まとめ
今回は、「鉄拳8 UnrealEngine5 Niagaraによる開発事例と最適化」に関する資料の一部について実践した資料を記載いたしました。
最適化の検証は別資料で上げますが、最適化効果は絶大なので開発しているゲームでRenderThreadが重かったりしたらこちらの実装を試してみるといいと思います。