パーティクルの動きに不規則な「揺らぎ」を加える『Noise』モジュールは、炎の火の粉の不規則な上昇や、空気中を舞う埃、吹雪などを表現するために非常に重宝します。しかし、何気なくこの機能をONにしたままパーティクルを量産すると、ゲーム全体の動作を深刻なレベルでフリーズさせる原因になります。本記事では、このCPU負荷爆発バグの内部的なメカニズムを『折り紙を折るスタッフの割り当て』の例え話を交えて分かりやすく解説し、最適化のステップと、システム移行のアプローチを提示します。
1. 例え話で理解する:『店長にやらせる大量の折り紙工作』
このCPUボトルネックの問題を直感的に理解するために、『店舗運営における業務の役割分担』を例えに考えてみましょう。
あなたはあるお店(ゲームエンジン)の経営者です。お店の統括やレジ打ち、事務処理など、お店をスムーズに回すための最も重要なメイン業務(ゲームの物理計算やC#スクリプトの実行)を担当する『優秀な店長(CPUのメインスレッド)』がいます。しかし、イベントの装飾として、店長に対して『1秒間に5000枚の複雑な折り紙(各粒子の複雑な3Dノイズベクトル計算)』をすべて手作業で折るように追加の仕事を課してしまいました。
店長は超人的なスピードで折ろうとしますが、折る作業(CPUでの浮動小数点演算)に付きっきりになってしまい、本来の業務であるレジ打ち(Update処理)や接客(描画コマンドの発行)が完全にマヒし、お店の前に大行列(フレームレートの低下)ができてしまいます。これが、NoiseモジュールをONにしたShurikenパーティクルが引き起こす『CPUメインスレッドの占有バグ』です。
本来、このような「単純だけど数が膨大な作業(パーティクルごとの並列計算)」は、1000人の折り紙が得意な専門アルバイト(GPUの並列コア)に作業を均等に割り振って一斉に折らせる(GPUでのCompute Shaderによる計算)のが正しい業務設計です。店長(CPU)に1人で折らせようとすること自体が、この高負荷の根本的な原因なのです。
2. 解決策A:Shurikenのノイズ品質とオクターブ数の制限
ゲームの仕様上、Shurikenシステムから他のエフェクトシステムへ移行できない場合は、まず店長(CPU)の作業内容を極限までシンプルに減らす(ノイズの計算精度を下げる)調整を行います。
設定の最適化手順:
- 対象のParticle Systemアタッチ先のGameObjectを選択し、インスペクターの『Noise』モジュールを開きます。
- 『Quality』のドロップダウン設定を確認します。デフォルトで『High(3Dノイズ)』になっている場合は、これを『Low (1D)』または『Medium (2D)』に変更します。これにより、3次元空間の複雑なノイズ計算が1次元・2次元に簡略化され、計算負荷が約3分の1になります。
- 『Octaves(オクターブ)』の数値を調整します。オクターブとはノイズを重ね合わせてディテールを細かくする設定ですが、数値が『2』や『3』になると、CPUは1つのパーティクルに対して2倍、3倍の計算ステップを実行します。これを必ず『1』に設定し、ノイズ計算の繰り返しを最小限に抑えます。
- 『Frequency(周波数)』を下げて、ノイズの再計算スパンを遅くし、計算のオーバーヘッドを削減します。
3. 解決策B:GPU動作である『VFX Graph』への移行(推奨)
飛散するパーティクルの数が合計で1,000個を超えるような豪華なエフェクト(大爆発の火花、激しい嵐、砂嵐など)において、Noiseによる揺らぎ効果を適用したい場合は、CPUでの計算を伴うShurikenを完全に廃止し、GPUのCompute Shaderで並列ノイズ計算を行う『VFX Graph』に置き換えます。
VFX Graphには、標準で『Turbulence(乱流ノイズ)』や『Vector Field(ベクトル場ノイズ)』といった超高品位な3Dノイズモジュールが用意されています。これらはすべてGPUの何千というコアで一斉並列処理されるため、パーティクルが10万個に増えても、CPUのメインスレッド(店長)の処理負荷は完全に **ゼロ** のままで、滑らかな60FPS/90FPSでのランダムな揺らぎエフェクトをモバイル実機でも涼しい顔で描画することが可能になります。