このドキュメントは、カスケード、マテリアルエディタ、マチネ、一般的なエフェクトに関連したパフォーマンス問題に関する知識があることを前提としています。パフォーマンス問題には複数の解決方法があります。このドキュメントでは、Epic のエフェクトチームが利用可能なツールで行ったこれらの問題の解決方法を概説します。
エフェクト パフォーマンスを低下させる一般的な原因
$ Overdraw (オーバードロー) :パーティクルが覆うスクリーン スペースの面積、およびそれらのパーティクルに関する命令数です。オーバードロー = ピクセルシェーダーの負荷 = レイヤー数 × 影響を受ける平均ピクセル数(GPU) $ Tick Time (ティック時間) :ゲームスレッドによるすべてのパーティクルシステムの更新に要する時間です。(ゲーム スレッド) $ Draw Calls (描画コール) :GPU 用のステート設定です。(レンダリング スレッド) $ Bounds Calculation (境界計算) :カメラの視錘台に基づいたビジビリティ決定に使用されるエフェクト境界の更新に要する時間です。(エフェクト結合境界が見えるか?)
これらの主要な問題には、問題発生の原因となる下位の問題が多数含まれます。通常、下位の問題それぞれについて、パフォーマンス問題を処理するためのツールが用意されています。
エフェクト パフォーマンスのためのコアシステム
$ GPU :スクリーン上にピクセルを描画するのに要する時間です。(オーバードロー) $ Game Thread (ゲームスレッド) :そのパーティクル システム ビヘイビアの更新に要する時間です。(ティック時間) $ Render Thread (レンダリングスレッド) :パーティクル ジオメトリおよび関連する描画コールをパック化するために要する時間です。(描画コール)
パフォーマンスへの配慮
パフォーマンスの観点から見ると、あらゆる要素が絡み合う壮大なスキームにおいては、パーティクル数の役割は取るに足らないものです。システム全体のパフォーマンス低下に関しては、画面の分割に関わらず、マテリアルの複雑度と画面の適用範囲 (オーバードロー) こそが諸悪の根源です。テクスチャ頂点のカラーに対してテクスチャを乗算し、アンリット状態のマテリアル内のエミッシブ インプットにつなげただけの簡単な放射スパークの場合には、命令もわずかで済みます。これらを一日中溢れるほどスポーンしても、パフォーマンス全体への影響はおそらく非常に小さなものでしょう。スプライトは小さいので画面への適用率も低く、マテリアルの複雑さの面でも負荷がかからず、かつ迅速に描画できます。頂点数は、長期的に見て、極端な数に達しない限り (数百 ~数千以上) 特に気を使う必要はありません。
全般的なパフォーマンスへの影響がより顕著なのは、マテリアルに関する命令数です。火炎や煙などのマテリアルの場合、基本的に 2 通りの方法があります。1 つめの方法は、より複雑なマテリアルをエフェクトに対して作成することです。例として火炎を使用し、スポーンするスプライトの数を少なくし、拡張したマテリアルのランダム度と複雑度に委ねてエミッタを生き生きとしたものにします。2 つ目の方法としては、負荷が低いマテリアルを使い、スポーンするスプライトの数を多くします。全体的な負荷は同じぐらいに保ちながら、より複雑なマテリアルとは対照的にパーティクル数を高く設定してランダム度を調節します距離を短縮することで、マテリアルの負荷を飛躍的に削減できる点に留意してください (画面でカメラから 2 倍離れた位置に描画されたクワッドは、ピクセル領域合計が距離と共に指数関数的に減少し、オーバードローされるピクセル数が減少するため、負荷は 4 分の 1 になります)。
使用するマテリアルの負荷、スポーンするスプライトの数、さらに画面上でこれらのエフェクトの位置までの距離を分析する必要があります。これら 3 つの特性はエミッタの複雑度を決定する主な要因であり、それぞれにバランスを保つ必要があります。また、パーティクル システムの近くに、またはシステムから離れて移動する場合には LOD システムを巧みに利用して、スプライト数、マテリアルの複雑度、その他の要因を調整します。
通常は、パフォーマンスの向上手段としてマテリアルの複雑度を削減し、一般的にエミッタで作業する際にはオーバードローの可能性に常に気を付けてください。大量のパーティクルをスポーンする場合、または頂点数が非常に多いメッシュ エミッタを使用してメッシュをスポーンする場合を除き、パーティクル数を心配する必要はありません。
問題の原因を突き止めたら、次の方法を用いて最適化を開始します。