Wwise 2015.1beta / マルチコア・マルチストリーム時代のオーディオエンジン

Wwiseの2015.1betaが公開されている。

2014.1もMIDIサポートのような大規模なアップデートだったが、2015.1もかなりの新機能を追加している。
Wwiseの動向が重要なのは、Wwiseが比較的若いオーディオミドルウェア(最初のリリースは2006)であり、FMODやADXのような定番オーディオミドルウェア当然備えている機能をトレンドに合わせて取り込んでいる点と言える。Wwiseはそのハイレベルな制御構造がウリだったが、年を追うごとに"コンソール的"な細かい制御やコントロールサーフェスのサポート等流行を取り入れ、既存のオーディオミドルウェアに近いフレキシビリティ/プログラマビリティを得つつある。

カスタムスケジューリング

あまりリリースノートで強調されていないが、2015.1で重要なアップデートは"AkInitSettings::bUseLEngineThread"パラメタの導入だろう。
Wwiseは従来、ミドルウェアが作成するスレッドでオーディオ生成やミキシングを行うスタイルのミドルウェアとして提供されてきた。しかし、このパラメタを無効化することでオーディオ処理をシングルスレッド化することが可能になった。
... ゲーム機がマルチスレッドじゃなかった時代はどうしてたんだというのは当然の疑問かもしれないが、WwiseXbox360/PS3世代のエンジンなのでそもそもマルチスレッド前提となっている。
カスタムスケジューリングにより、オーディオの遅延をより精密にコントロールすることができる。ドキュメントはRenderAudio()によりどの程度の粒度のオーディオが生成されるかどうかには触れていないが、マルチスレッドモードではオーディオは"常に"生成されるためオーディオイベントと実際に発生するオーディオの間には予測不可能な遅延が存在することになる。
ドキュメントではいくつかのゲームコンソールではこのフラグはサポートされないとしている。理由は謎だが、ハードウェアDSPとの連携の都合ではないかと考えている。

マルチコア・マルチストリーム・マルチデバイス

オーディオミドルウェアを取り巻く環境として重要なトレンドは同時に押し寄せている"マルチ化"の流れと言える。

  • マルチコア

XboxOne/PS4いづれも6コアがゲームに使用できるコアとして解放されていると言われている。このため、通常のゲームはこの6コアを適当に役割分担させて使用させる傾向にあり、オーディオミドルウェアはこの役割分担によくマッチする方針でデザインされる必要がある。Wwiseのカスタムスケジューリングも、ゲームのこのトレンドに合わせて投入されたと考えられる。

  • マルチストリーム

Xbox360/PS3時代から、ゲームは独占的にオーディオ出力デバイスを使用することができない状況にある。ゲーム機本体の音声チャット機能やBGM再生機能との統合のために、ゲームオーディオをBGM成分と効果音/セリフ成分に分割してレンダリングする必要がある。Wwiseは2015.1から音声ストリーム(= バス)毎に"BGM"フラグを立てられるようになり、ゲーム機本体側のBGM機能とより良く統合できるように配慮されている。(従来は下記のような専用のストリームに纏める必要があった。)
XboxOne/PS4からはより状況が複雑になり、コントローラの音声出力端子(やPS4の場合コントローラのスピーカ)を通してプレイヤのパーソナルオーディオを提供できるようになった。また、ゲーム録画がプラットフォームとしてサポートされているため、これらへの著作権的な配慮も必要となっている。WwiseWiiUPS4向けにコントローラスピーカをサポートし、XboxOneとPS4では"録音禁止BGM"もサポートしている。

オーディオミドルウェアの立場を難しくしているのは、VRを代表としたマルチデバイスの登場と言える。今のところ、OculusのオーディオSDKがサポートしている環境はUnity / Wwise / FMODであり、Wwiseは一応席を確保している。
個人的にはここにAtmosやdts:Xのようなオブジェクトオーディオフォーマットも加わると予想していたが、現状ではあまり大きな動きは無いようだ。今週開催されるE3で何か発表されるかもしれないが、あまり期待はしていない。dts:HeadphoneXはAndroid上でマルチチャンネル出力すれば適用することができる( http://www.dts.com/~/media/8baf683db14d42cb9bc218374395804c/DTS_HPX_WP001_GameDeveloperWhitePaper.pdf )が、現状WwiseAndroid上でのマルチチャンネル出力をサポートしていない。