お世話になっております。
ご確認ありがとうございます。
> fx.Niagara.GpuScriptsCompiledBySystem を 0 にしたところ、確かに解決するNiagara Systemがある一方、ご確認いただいた通り再コンパイルを誘発してしまうNiagara Systemもあることが確認できました。
(略)
> そして、この条件に該当するNiagara Systemをローカルで再保存すると再コンパイルが発生しなくなるようでした。
Niagaraシステムはエミッタやモジュールを参照する際に、単純にアセットのパスのみを保持するのではなく、そのバージョンやコンパイル条件を符号化した付随情報を一緒に保持しています。そのため、参照先のバージョンが変更されていたり、より新しいエンジンでコンパイルされたなどの条件下では、「念のためNiagaraシステムを最新状態にリフレッシュする」という意図で NeedsRequestCompile() が true を返し、コンパイルが誘発される場合があります。
これを抑制するにはエディタ上であらかじめ(できればコンパイルを行ったうえで)再保存することが有効です。
また、Niagaraシステムを指定して、そのシステムが依存するすべてのアセットを追跡してまとめてリフレッシュを行うことで、ロード時のコンパイルを抑制する「fx.PreventSystemRecompile」というコンソールコマンドがありますので、必要に応じてご利用ください。
(これをプロジェクトのNiagaraシステムすべてに対して行う「fx.PreventAllSystemRecompiles」というコマンドもあります)
詳細はこちらのリファレンスもご確認ください:
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-console-commands-reference
ただし、前回のご返信で申し上げましたように、現在のUE5.7の実装ではGPUスクリプトの実行に必要なリソースであるシェーダマップのロードが行われていないタイミングで NeedsRequestCompile() を走らせてしまうため、必ず true 判定が下りるという不具合があります。
そのため、ご提供いただいた再現プロジェクトでは fx.PreventSystemRecompile を使用してもロード時再コンパイルを防ぐことができません。大変恐縮ながら、現時点では「fx.Niagara.GpuScriptsCompiledBySystem 0 」との組み合わせが必須となります。
以下、頂戴した4つの質問への回答となります。
> 1. 現時点でおすすめの設定をご教示いただけませんでしょうか。直近のリリースを予定していない中長期の開発を想定し、ご提示いただけると幸いです。
今回頂戴した再現プロジェクトのケースを見る限りでは、Niagaraシステムロード時の誤った NeedsRequestCompile() = true 判定を避けることができないため、現時点では、「 fx.Niagara.GpuScriptsCompiledBySystem」を 0 に設定して運用いただくのがおすすめとなります。
この不具合に関しては社内で確認のうえ、バグトラッカーに起票する予定です。
また、Niagaraシステムは、依存しているエミッタが新しくなれば再コンパイルが必要となりますので、ロード時コンパイルが目立つNiagaraシステムについては再保存や「fx.PreventSystemRecompile」を使用して最新の状態にリフレッシュするよう心掛けていただくと、ロード時コンパイルの乱発が抑えやすくなるかと思います。
> 2. fx.Niagara.GpuScriptsCompiledBySystem 0 は特に知られた副作用はございますでしょうか
このCVarを 0 に設定しますと、GPUスクリプトのコンパイルがシステムロード時ではなく、そのGPUスクリプトを使用するエミッタの初使用時まで延期されます。これにより一般に、ロード時に集中的に現れるヒッチのタイミングを、分散させる効果が期待できます。副作用としては、この処理タイミング変更により、かえってヒッチが悪目立ちしてしまうケースがあることが挙げられます。
(2026/03/19 追記)また、CPU側(VMスクリプト)とGPUスクリプトのコンパイルが同時並行で行われなくなるため、Niagaraシステムのコンパイルにより時間がかかるようになり、VFXアーティストのイテレーションが多少悪化する恐れがあります。
ただし、再現プロジェクトのケースでは処理タイミングをずらすことでシェーダマップのロードが間に合い、NeedsRequestCompile() が論理的に正しい判定を行えるようになって、再コンパイル(=ヒッチ)自体を回避できているようでした。
> 3. fx.Niagara.GpuScriptsCompiledBySystem 0 を設定した場合、アセットの再保存は再コンパイルの抑制として有効でしょうか。
> (特に、特定環境に依存せずにRequestCompileが抑制されるのかが気になっています)
はい、(GpuScriptsCompiledBySystem の設定値いかんに関わらず)アセットの再保存は再コンパイルの抑制として有効です。必要に応じてコンソールコマンド「fx.PreventSystemRecompile」もご利用ください。
> 4. もしよろしければ、中規模以上または長期プロジェクトでは、一般的にどのような設定値もしくは運用方針を取ることが多いかご教示いただけませんでしょうか。 公開可能な範囲で構いませんので、推奨されるアプローチの方向性をご教示ください。
基本的にデフォルトの設定がおすすめの設定となります。弊社の内製タイトルで、大規模かつ非常に長期にわたって運営しているタイトルがあるのですが、こちらのプロジェクトでは、特に設定値を変更せず、エンジンデフォルトの設定で開発を行っております。
また、再コンパイルの問題がないとしても、ゲーム中に大規模なNiagaraシステムのロードを行うと、どうしてもヒッチの原因となるため、(マップに直置きしたNiagaraですと難しいと思いますが)可能な限りゲームの幕間で事前ロードを行う手順をとることをお勧めいたします。
以上、よろしくお願いいたします。
[Attachment Removed]