目次

メモリプールの最適化

以下は、各メモリプールの概要とその使用方法です。

  • デフォルト(Default ): 高レベル サウンド構造に一般使用されるプール。バンクをロードする時に非波形データが行き着く場所。ゲームオブジェクトとその関連ポジショニング、RTPCデータ構造もここに保存されます。また、ここには、ポストされたイベントがオーディオスレッドに処理される前に保存される場所であるコマンドキューも含まれています。更に、高レベル パーボイス再生データも少量含まれます。
  • ローワーエンジン (Lower Engine): メインのオーディオ処理パイプラインプール、何も再生されていない場合には、基本的に空。ここには、デコンプレッション、フォーマット変換、ピッチシフト、エフェクト処理、ミキシングなどのための中間処理バッファが割り当てられます。

メモリプールサイズの選択

初めてサウンドエンジンを使う時に、最悪のシナリオでも稼働できるだけの充分なリソースを確保しておくため、サウンドエンジンの内部メモリプールのデフォルトサイズは非常に大きくなっています。各プールのデフォルトサイズは以下の通りです。

  • デフォルトのメモリプールは、16 MBです (AkInitSettings 構造内で)
  • ローワーエンジンメモリプールは、16 MBです (AkPlatformInitSettings 構造内)
Note.gif
注釈: ストリーミングマネージャを実装するためにサンプルコードを使用する場合は、ストリーミングバッファ用にも、8MBが配分されます(Stream I/O)。

デフォルトメモリプールのサイズは、最終的に作成するゲームの種類によって変わります。例えば、ゲームのオーディオアセットが合計数ギガバイトあっても、一度に4、5個以上を再生することは稀で、エフェクトも皆無または少数であれば、デフォルトメモリプールの必要メモリがより大きくても、ローワーエンジンメモリプールの必要メモリは小さいかもしれません。一方、ゲームのサウンド数は少なくても、全て同時に再生して、リバーブやエコーなど多くの環境エフェクトを使う場合、例えばファーストパーソンシューティングゲームなどでは、デフォルトメモリプールの必要メモリがより小さくなり、ローワーエンジンメモリプールの必要メモリはより大きくなるかもしれません。ローワーエンジンメモリプールのサイズは、最終的にサウンドエンジンで何をするのかによります。ゲームで、多数のボイス(バーチャルボイスも含め)を同時に再生して、大量のエフェクトを処理する計画であれば、このプールの必要メモリが増えます。

各種メモリプールのサイズを設定する

PCで、バンクをロードせず、サウンドを再生しない状態では、メモリ消費量は約150KBになると予想されます。正確なメモリ消費量を知るには、Wwiseの、Profilerレイアウトで、Performance Monitorの、Total Used Memory(メモリ消費合計)の数値を確認してください。当然、ロードされるアセット数、再生されるボイス数、ゲームオブジェクトのポジション数などが増えると、この値も増えます。

それぞれのメモリプールに必要なメモリを左右する条件として、オーディオ品質、ロードするサウンド数、同時に再生するボイス数、サウンド構造の複雑性、使用するエンコード方式、処理するエフェクトの種類と数、3Dポジションが設定されているサウンド数、スイッチ数など、多数あります。

必要なメモリを確実に知る唯一の方法は、以下の通りです。

  1. 各プールに、それぞれ任意のメモリをアサインする。可能であれば、まずデフォルトのメモリサイズからスタートする。
  2. Wwiseをゲームに接続する。
  3. サウンドエンジンの、Profileバージョンを使い、ビジーな(込み入った)ゲームシナリオを稼働させる。
  4. Advanced Profilerの、Memoryタブを確認する。各プールに必要なサイズの目安が、Peak Used(使用量のピーク)の欄で分かる。

一般的に、それぞれのプールの最適サイズは、ピークのメモリ使用値よりも約15〜20ほど大きい値となる。

デバッグ専用の割り当ては、Communications、Monitor、および Monitor Queue メモリプールでなされており、Release バージョンでは作成されません。これらのプールのサイズを除くと、リリースバージョンのメモリ使用量の目安がつく。

Note.gif
注釈: Memory タブで、ゲームに接続せずにWwise自体からプロファイル情報を取り込んで、サウンドエンジンメモリの使用量を調べることもできます。

どのサイズからスタートすべきか

多くの場合、デフォルトのメモリプールサイズ(1プールあたり16MB)からスタートするのが良いでしょう。これだけ大きいプールサイズであれば、実際のメモリ消費が簡単に分かり、プールごとに適宜、小さくできます。ただし、各種プールに割り当てることができるメモリ量が、これよりも制約されている場合(16MBが多すぎる場合)は、以下の数値からスタートしてみてください。 デフォルトメモリプール:2MB ローワーエンジンメモリプール: 2MB

  • ストリーミング管理: 2 MB

プールごと2 MBもあれば、すべてとはいかなくとも、シナリオの大部分を扱うことができます。ストリーミングのバッファサイズは、ストリーミングするサウンドの数、サウンド品質、ストリーミングサウンドの時間の余裕などによって変わります。8MBというデフォルト値は、ほとんどのゲームではメモリの無駄遣いと受け取られますが、前述の通り、大きくスタートして、メモリ使用量が明確になった時点で削減するのが、最適の方法です。ストリーミングバッファメモリの詳細については、 Audiokinetic ストリームマネージャ初期化設定 を参照してください。

メモリプールのサイズと、プラットフォーム

プラットフォームごとにプールサイズを設定する時に大事なのは、メモリプールのサイズは、プラットフォームの種類よりも、オーディオの内容と使用方法によって決まるということです。そこで、各種プールのサイズは、どのプラットフォームでも同じサイズからスタートして、Profilerのメモリ消費指数を参考にしながら、それぞれのプラットフォームに合わせます。

各メモリプールに対して最適なサイズはどれくらいでしょうか?これは多くの要素に依存します。例えば:

  • 使用したファイルフォーマット
  • 一度に再生できるサウンドの最大数
  • バンクを使用して事前にロードするサウンド数
  • 使用するエフェクト
  • Events/RTPC/ポジションアップデートの毎秒レート
  • 選択したスピーカーの設定 (特にPCにおいて )
  • その他関連の考慮すべき事柄

テスト用最悪のシナリオの選択

各メモリプールでは、異なった最悪のシナリオが起こり得ます。例えば、64サウンドを同時に再生すると、ローワーエンジンプールの使用量が増加しますが、アッパーエンジンプールの使用量はわずかしか増加しません。一方、20個のバンクを同時にロードすると、ローワーメモリプールの使用量に影響を与えずにアッパーエンジンメモリの使用量が増加します。従って、状況によってメモリの使用のされ方が異なってくる場合があるため、すべてのテストに1つのみの最悪のシナリオを使用しないことをお勧めします。

テスト対象となる特定の状況の1つは、レベル間でサウンドバンクがロードおよびアンロードされる時に発生します。この状況では、アッパーメモリプールにピークが発生するためです。例えば、ゲームのレベル1とレベル2からのバンクが短い間隔で同時にロード出来る場合には、このピークが発生します。

Warning.gif
警告: PCのピークメモリ使用量を確認するためのテストを実行する時には、ゲームを実行しているPC のセットアップ構成が5.1 以上に設定されていることを確認する必要があります。これは、スピーカーのセットアップがステレオである場合にはサウンドエンジンが最適化を行い、5.1に比べて使用メモリを少なくするために必要となります。

メモリの不足

「メモリ不足」状態に対しては、この状況の発生時によって、サウンドエンジンが異なった反応をします。例えば、以下のようなシナリオにおけるメモリ不足の場合、次のような事象が発生します:

  • サウンドエンジンの初期化:初期化の失敗。
  • バンクのロード:バンクロードの失敗。
  • ボリュームなどのパラメータの移行の開始:移行がスキップされ、パラメータが移行なしで目標値に直接ジャンプする。
  • サウンドの再生:再生が失敗するか優先度の低い他の再生が新しい再生のためのメモリを解放するために停止する。

メモリ問題の検出

Wwise Profiler を使用すると、ゲーム中で発生するあらゆるメモリ割り当ての失敗に対して、警告通知がキャプチャログに送信されます。ゲームプレイ中の各ポイントで、メモリ内でどのメモリプールが欠けていたかを調べるためにこの通知リストをチェックすることができます。

メモリの使用が高くなる原因

以下のような事項により、メモリの使用率が高くなります:

  • バンクのロードにより、デフォルト(Default )メモリプールの使用量が増加します。各バンクが使用するメモリ量は異なることに注意してください。デフォルトメモリプール内でバンクに使用されるメモリは、バンクの物理的な大きさでなく、このバンクに含まれるサウンドやイベントの数に依存します。
  • リバーブやディレイなどの一部のエフェクトは、再生時にある程度のメモリを消費します。
  • 複数サウンドの同時再生は、ローワーエンジンデフォルト(Lower Engine Default)プールで使用されるメモリ量を大幅に増加させます。
  • 短時間で複数のアクションを送信すると、デフォルトプールのメモリ使用量が増加します。
  • ゲームオブジェクトの登録、“パーオブジェクト” パラメータの設定、オブジェクト位置の設定などはすべてデフォルトプール内の少量のメモリを使用します。ただし、このメモリを解放するために未使用のゲームオブジェクトが登録解除される必要があることに注意してください。さもなければ、使用されるメモリ量が絶えず増加します。

更なる詳細は以下のセクションからご覧いただけます:

メモリしきい値の定義

サウンドエンジンの初期化時に、サウンドエンジンの1つ以上のメモリプールに対するメモリしきい値を定義するオプションがあります。

サウンドエンジンの初期化パラメータの値を変更することで、メモリプールのしきい値を定義することが可能です: AkInitSettings::fDefaultPoolRatioThreshold および AkPlatformInitSettings::fLEngineDefaultPoolRatioThreshold

デフォルトでは、デフォルト値1(または100%)の使用により、メモリしきい値は無効になっています。0から1の間の任意の値を設定することにより、これを有効にすることができます。

メモリしきい値が無効にされると、メモリアロケータが正常に動作します。有効にすると、使用されているメモリの比率が指定されたしきい値を下回っていることをエンジンが定期的に確認します。しきい値を上回ると、システムは優先度の最も低いサウンドを破棄し始めます。

メモリしきい値が使用されていない状況では、エンジンはサウンド優先順位を優先しますが、メモリ不足の状態においては、優先度の高いサウンドを再生するのに十分なメモリがエンジンにない場合があり、この場合にはこのサウンドが破棄されます。メモリしきい値が使用される場合には、優先度の高いサウンドのためのスペースを解放するために、優先度の低いサウンドが破棄されます。

一般的には、AkPlatformInitSettingsfLEngineDefaultPoolRatioThreshold パラメータのしきい値を定義します。AkInitSettingsfDefaultPoolRatioThreshold パラメータ上へのしきい値の設定は、これがバンクのロードにも使用されるため予期しない動作を引き起こす場合があります。

参照: