距離に応じたサウンド再生処理のカリング

広大なフィールドでのサウンド処理負荷の軽減を目指して

広大なフィールドを使ったゲームを開発している際には、如何にフィールド上のキャラクターやオブジェクトのそれぞれの処理負荷を下げるかが重要になります。
サウンドの再生処理についても同様に処理負荷の軽減が必要になります。
広大なフィールドにおけるサウンド処理では、距離に応じてサウンドのボリュームを徐々に下げていく減衰効果をかけることが多くあります。この処理は減衰領域外で音声が無音状態で再生されたとしても、プレイヤー(リスナー)が領域内に入ることを考慮してサウンドの再生制御は常に行う必要があります。
しかし、数百数千個の音が同時に再生されうる環境の場合に、すべてのサウンドの再生処理を行ってしまうとその処理負荷は決して無視できるものにはなりません。
criware_ue4_038_explanation_attenutaion_distance_j.png
そこで、処理負荷軽減の方法として、プレイヤーの行動範囲や、移動速度などが決まっているのであれば、距離減衰領域のさらに外側ではサウンドの再生制御そのものを行わないようにすることで、必要以上のサウンドの再生を行わなくさせ処理負荷の軽減につなげることができます。
criware_ue4_038_sound_process_culling_j.png

発音の距離カリング機能

CRIWARE Unreal Engine プラグインではサウンドの再生においては、Componentを生成したり、Unreal Engine上のアクターなどの位置情報などを紐づけたりした上で再生が行われます。
この処理自体も数百や千といった数の発音が瞬時にフィールドのあちこちでトリガーされた場合は、無視できない処理負荷になります。
CRIWARE Unreal Engine Plugin では、3D 音源とリスナーの距離が遠い場合、発音トリガーを無視することで処理負荷を削減することができます。これを発音の距離カリング機能と呼びます。

仕様

下記条件を満たすと音声再生がキャンセルされます。
  • 3Dサウンドである(つまり2Dサウンドではない)
  • 単発サウンドである(つまりループサウンドではない)
  • 音源とリスナーの距離 > (音源の距離減衰の最大値 + 任意のマージン)
3Dサウンドかどうかの判定について
  • 以下のサウンドを3Dサウンドとみなします
    • SpawnSoundAtLocationで再生
    • SpawnSoundAttachedで再生
    • PlaySoundForAnimNotifyで再生
    • "Only 2D Sound"プロパティがfalseのAtomComponentから再生
  • 以下のサウンドを2Dサウンドとみなします
    • SpawnSound2Dで再生
    • "Only 2D Sound"プロパティがtrueのAtomComponentから再生

距離カリング機能の有効化手順

(1) プロジェクト設定画面を開く

プロジェクト設定ウィンドウを開き、CriWareのページを表⽰します。
criware_ue4_optimization_culling_project_settings.jpg

(2) CriWareプラグイン設定を変更する

"Culling Margin Distance (Unreal Unit)"を設定します。
「⾳源とリスナーの距離 > (⾳源の距離減衰の最⼤値 + "Culling Margin Distance")」のときトリガーカリングが行われます。

(3) Atom Cue アセットの設定画面を開く

AtomCueをアセットブラウザーで開きます。
criware_ue4_optimization_culling_cue_asset.jpg

(4) Atom Cue アセットの設定を変更する

"Enable Distance Culling" にチェックを入れます。

キューごとに異なる設定を行う場合

Distance Culling 機能に関する設定は既にプロジェクト設定ウィンドウで行いましたが、キューごとに異なる設定を行いたい場合は以下の設定を追加してください。
  1. "Override Cull Settings" にチェックを入れる
  2. "Cull Distance Margin" を設定する

⾳源の距離減衰の最⼤値を確認する

⾳源の距離減衰の最⼤値を確認したい場合は下図の数値をご参照ください。
criware_ue4_optimization_culling_cue_asset_max_distance.jpg

情報の取得

  • UAtomComponent::GetCullDistance()
    • 現在このAtomComponentに適用されているカリング境界距離を返します。
    • つまり最後に再生したキューの(最大減衰距離 + カリングマージン距離)を返します。
BP, C++共に情報を取得することができます。
criware_ue4_optimization_bp_economic_tick_n_culling.jpg

複数のキューのトリガーカリングの一括設定

複数のキューをまとめてトリガーカリング設定を行いたい場合はアセットアクションのプロパティマトリクスによる一括編集が有効です。
プロパティマトリクスを用いた一括編集の手順については「 複数のアセットをまとめて編集する 」をご参照ください。