目次

Wwise SDK 2018.1.11
ストリーミング/ストリームマネージャ

イントロダクション

帯域幅が制約されると、多くの場合ストレージデバイスへのアクセスがゲーム内でのボトルネックになります。従って、データ転送要求の秩序を保つために、ゲームタイトルは通常I/Oへのアクセスを集中させます。順序は、転送サイズ、スループットとレイテンシに対する優先順位および消費者のニーズに基づいています。オーディオには、通常I/O 負荷があります:大抵の場合、音楽や長いサウンドは再生時にディスクからストリーミングされます。

Audiokinetic の I/Oストリーミングソリューション

AudiokineticサウンドエンジンのI/Oストリーミングソリューションは、自律性のあるオーバーライド可能なストリーミング管理モジュールより構成されています。次の図は、モジュールと、サウンドエンジン/ゲームアーキテクチャ内でのモジュールの場所を示すブロック図です:

Streaming_WithCustomLowLevelIO.gif

IAkStreamMgr.hで定義されるそのパブリックインターフェースは、サウンドエンジンおよびゲームの両方で使用されます。サウンドエンジンは、サウンドバンクとストリームオーディオをロードするために、このインターフェースを使用します。一方、ゲームは、グラフィック、テクスチャ、レベル、保存したゲームなどをロードするために同インターフェースを使用します。

パブリックインターフェースは、データ転送のためのプラットフォーム非依存の高レベル抽象化で、プラットフォームのオペレーティングシステムやハードウェアの近くにあるファイルや他のオブジェクトへのハンドルを、いわゆる “ストリーム” にラップするストレージ(I/O)デバイスを伴います。このドキュメンテーションでは、ストリームオブジェクトとストリームファクトリを実装するモジュールを、High-Level Stream Manager、または、単に Stream Manager と呼んでいます。

必要に応じ、Stream Manager を完全にオーバーライドすることができますが、Wwise SDK にはデフォルトの実装が付属しています。このデフォルト実装は、使用方法がシンプルな Low-Level I/O (低レベルI/O)と呼ばれるI/O関連のコードをフックするための別のレベルを定義します。これは、Wwise I/O をゲームへ統合する望ましい方法です。

Default Streaming Manager Information

Note: この章全体を通じて、Audiokinetic の Stream Manager 実装に固有の追加的詳細を示すこのような囲み欄があります。

AK::StreamMgr::Create() のように、ストリーミングに関連しているが、Stream Manager のデフォルト実装に固有の関数や構造体は、SDKのインクルードディレクトリの AkStreamMgrModule.hで定義されています。

Wwise I/Oの統合

クイック統合

Wwiseを始めて統合する場合には、速やかに使用を開始できるよう、Wwise SDK付属のストリームマネージャおよび低レベル I/Oのデフォルトサンプルを使用してください:

1)AkStreamMgr.libとリンクする。

2)デフォルトのFile Location Resolver ならびに Blocking I/O Hook をゲームオブジェクトに含めます:

  • SDK/Samples/SoundEngine/{Platform name}/AkDefaultIOHookBlocking.h および .cpp
  • SDK/Samples/SoundEngine/{Platform name}/AkFileHelpers.h
  • SDK/Samples/SoundEngine/Common/ の全ファイル

3)Stream Manager作成後、低レベル I/O フックデバイス CAkDefaultIOHookBlockingをインスタント化、初期化します。代わりに、I/Oフックのファイルパッケージ拡張機能(次のセクションを参照)を実装する CAkFilePackageLowLevelIOBlocking を使用することも可能です。これで、後ほどこのデバイスが必要な場合、使用可能な状態になります。初期化方法の例は、ストリーミングマネージャの初期化 を参照してください。

4)デフォルトのFile Location Resolver ( CAkFileLocationBaseで実装) は、Wwiseオーサリングツールによって生成されたファイルのあるディレクトリを知る必要があります。コード内で、 CAkDefaultIOHookBlocking::SetBasePath()(または CAkDefaultIOHookBlocking::AddBasePath() )を使用して、オーディオアセットがデプロイされているベースパスを設定します。ローカライズされたアセットがある場合は、AK::StreamMgr::SetCurrentLanguage() を使用して、Stream Manager デフォルトモジュール上での現在の言語を設定します。ファイルロケーションデフォルトリゾルバが、言語名をベースパスに連結し、ローカライズされたアセットを探せるようになります。

Warning: AK::StreamMgr::SetCurrentLanguage() に渡す言語名にディレクトリ区切り文字(スラッシュまたはバックスラッシュ)を付けないでください。

サウンドエンジンがサウンドバンクをロードし、SetBasePath()(または AddBasePath() )で指定されたディレクトリのストリーミングファイルを再生する準備が整いました。 Wwiseツールでサウンドバンク出力ディレクトリにストリームファイルを自動的にコピーするには、ポストサウンドバンク生成ステップとして、"CopyStreamedFiles" 実行可能ファイルを使用する必要があることに注意してください。詳細は、Wwise HelpのSoundBank Settings (サウンドバンク設定)を参照してください。

ファイルパッケージ

CAkFilePackageLowLevelIOBlocking デバイスをインスタンス化すると、ファイルパッケージ使用の準備もほぼ整います。 ファイルパッケージ(*.PCK)は、1つのWwiseプロジェクトの全てのサウンドバンクとストリーミングオーディオの連結に起因する単一のファイルです。サウンドバンクとストリーミングファイルを異なるファイルパッケージにアサインすることも可能です。詳細は、File Packager ユーティリティドキュメンテーションを参照してください。

1)サウンドバック生成後のステップとして「FilePackager」を使い、サウンドバンク生成後、Wwiseツールに自動的にサウンドバンクとストリーミングファイルを使用してファイルパッケージを生成させます。 (WwiseヘルプのSoundBank Settingsセクションを参照してください)。

2)コードの中で、ファイルパッケージ(複数可)をCAkFilePackageLowLevelIOBlocking::LoadFilePackage()を使って明示して読み込みますLoadFilePackage()SetBasePath()(または AddBasePath() )で指定したパスからファイルパッケージを開きます。オーディオアセットのデプロイ先ディレクトリに、ファイルパッケージをインクルードする必要がありますが、ファイルパッケージが含むサウンドバンクとストリーミングファイルはインクルードする必要がありません。ファイルパッケージをロードすると、そのヘッダが解析され、CAkFilePackageLowLevelIOBlocking 内にルックアップテーブルが作成されます。AK::SoundEngine::LoadBank() への呼び出し、または、ストリーミングファイルの再生を伴うイベントに続いて、サウンドエンジンがファイルを開こうとすると、CAkFilePackageLowLevelIOBlocking が、ロードされたすべてのファイルパッケージのルックアップテーブルでこのファイルを検索します。見つからなかった場合、ファイルはベースパスで検索されます。

I/Oリードの既存I/Oマネージャへのルーティング

CAkDefaultIOHookBlocking は、プラットフォームファイルシステムAPIを使用してファイルを読み込みます。ご使用のゲームエンジンに既にI/Oマネージャがある場合、Wwise Stream Manager から発行されるI/Oリード要求を、既存のI/Oマネージャにルーティングしたいかもしれません。CAkDefaultIOHookBlocking::Read() を編集して、プラットフォームファイルシステムの代わりに既存のI/Oマネージャを呼び出します。必要ならば、CAkDefaultIOHookBlocking::Open() も編集します。

応用:低レベルI/Oを使用した作業

SDKで提供されるStream Managerデフォルト実装は、Low-Level I/O(低レベルI/O)と呼ばれるサブモジュールの上にあります。 上記のクラスはすべて、Low-Level I/O のサンプル実装として Wwise SDK で提供されています。 これらのクラスの関連ファイル一覧がこちらにあります:デフォルト低レベル I/O の実装.

Wwise I/O をゲームエンジンに統合する好ましい方法は、Low-Level I/O レイヤを、Wwise I/O とお使いのI/O管理技術間のアダプタとして実装することです。Low-Level I/O のゲームへの典型的な実装には、非常に簡単なものから非常に複雑で高度にカスタマイズされたものまで幅広くあります。手始めに、サンプルを使用してみるのもよいでしょう。

Low-Level I/Oモジュールには次のような2つの目的があります:

  • ディスク上のファイルロケーションをリゾルブ:Wwise に生成されたファイルは、ゲームディスク上のどこにでも配置可能ですが、サウンドバンクおよびストリーミングファイルの名前とID間の、プラットフォームファイルシステムに使用されるファイルディスクリプタへの適切なマッピングを確実にするために、コードの記述が必要です。
  • 全ての低レベルI/O操作を抽象化:Stream Manager にスケジュールされる全てのI/O転送要求(リード/ライト)が Low-Level I/O モジュールに配信されます。

Wwise I/O パフォーマンス

Stream Managerの初期設定は、Stream Manager と使用する Low-Level I/O システムとの相互作用や全体的な I/Oパフォーマンスに影響を与えます。 これについては、Audiokinetic ストリームマネージャ初期化設定 の章で詳しく説明されています。I/Oのヒント、トラブルシューティングと最適化 の章は、初期設定を微調整をする際の参考になります。

高レベルシステムマネージャ

IAkStreamMgr.h でそのインターフェースが定義されている Stream Manager は、サウンドバンクとストリーミングオーディオファイルを読み込むために Wwise サウンドエンジンによって使用されます。I/Oマネージャをお持ちでない場合、ゲームの全てのI/Oのために Stream Manager を使用することが可能です。同様に、カスタムソースプラグインを記述する場合にも、Stream Manage にアクセスすることができます。

高レベルストリームマネージャAPI概要 explains セクションは、Stream Manager の API について詳細に説明しています。これをクライアントとして直接しない場合は、この章を読み飛ばし、低レベルI/O フックを実装することにより、Wwise I/O をゲームに統合してください。

基本的な概念について少し説明します。Stream Manager は、2種類のデータの抽象ストリームを管理します:標準ストリームと自動ストリーム。

  • 標準ストリーム (Standard streams) (AK::IAkStdStream): AK::IAkStdStream::Read() または AK::IAkStdStream::Write() への呼び出しが発行された場合、Stream Manager へ I/O要求をオンデマンドで送出します。I/Oは、ユーザー指定のメモリ内で実行されます。
  • • 自動ストリーム (Automatic streams) (AK::IAkAutoStream): 自動ストリームは、AK::IAkAutoStream::GetBuffer() / AK::IAkAutoStream::ReleaseBuffer() メソッドで、内部ストリーミングメモリからアドレスを付与することによりデータにアクセスします。メインインターフェース AK::IAkStreamMgr は、ストリームファクトリとして機能します。自動ストリームはメモリを内部的に管理し、このメモリへの書き込みが自由になるとI/O要求が低レベルIOへ自動的に送出されます。

Stream Manager は、スレッドセーフであることを意図していますが、1つのスレッドのみが指定されたストリームを所有することがあります。

メインインターフェース AK::IAkStreamMgr は、AK::IAkStreamMgr::Get() を呼び出すことによりどこからでもアクセス可能です。そこから、ストリームオブジェクトを作成し使用することができます。

更なる情報

以下のセクションには、ストリーミングに関する更に詳しい情報が掲載されています: