バージョン

menu_open

メソッドNo.4: アクションイベントをプリペアする

このメソッドは、以下の場合に適しています。

  • メモリの使用量を抑えるには、メディアを非常に細かく分ける必要がある。

  • どのメディアアセットをどのSoundBankにアサインするのかを管理する手間を省きたい場合。

プリペア(Prepare / 用意)されたアクションイベントとは、いったい何でしょうか。 PrepareEvent()  機能を呼び出す時に、システムがそのアクションイベントを分析して、このイベントに関連する全ての構造(Structure)やメディア(Media)がメモリにロードされているかを、確認します。ロードされていなければ、システムが自動的に不足情報をディスクからストリーミングします。イベントのプリペア(用意)状態は、プリペア状態を明確に解除するまで、続きます。

[注釈] 注釈

事前にプリペア(用意)できるのは、アクションイベントだけです。PrepareEvent(プリペアイベント)方式は、ダイアログイベントに使えません。

この方式で最低1つのSoundBankを作成する必要がありますが、構造部分はイベントと同じバンクに入れることも全く別のSoundBankに入れることもできます。

PrepareEventメカニズムを使用するSoundBankを構築するときの条件は、必要なイベントや構造が必ず1つ以上のSoundBankに存在することと、個別のメディアアセットがファイルシステムでアクセスできることです。なお、構造データを複数のSoundBankに分割して入れると、メモリ効率が改善されます。

アクションイベントをプリペアする前に、そのイベント自体が、SoundBankからメモリにロードされた状態でなければなりません(LoadBank()を使う)。これは、イベントの中に、そのイベントをプリペアするための前提条件が入っているからです。

[注釈] 注釈

AK::SoundEngine::PrepareBankと組み合わせて、イベントをプリペアすることも可能です。PrepareBankメカニズムを使う最大の利点は、バンクをイベント用バンクと、メディア用バンクに分ける必要がないことです。このメソッドでは、全てのコンテンツを同じSoundBankに入れますが、AK::SoundEngine::PrepareBankが呼び出された時に、メモリにロードされるのはバンクのメタデータコンテンツだけです。ゲーム側でメディアが必要になれば、PrepareEventを使ってロードできます。

イベントをプリペアする場合に、SoundBankを設定するには:

  1. “Event”というSoundBankを1つ作成して、SoundBank Editorにロードする。

  2. 「Event」SoundBankに、プロジェクトのアクションイベントをいくつか追加するか、単純にイベントのWork Unitをいくつか、追加する。

  3. Media 列のチェックボックスを外し、Events列とStructures列のチェックボックスだけを選択したままにする。 PrepareEvent()を使用する場合は、メディアをバンクでなくディスクから直接ロードする必要がある。

    [注釈] 注釈

    今回の例では、全てのイベントと構造を1つのSoundBankに入れてあります。これは小規模なプロジェクトでは可能ですが、一般的には、コンテンツを複数のSoundBankに分割した方が良いでしょう。また、それぞれのイベントにロードすべき他のSoundBankへのレファレンスが含まれるため、改めてロードしたりSDKコマンドからプリペアしなくてもよい構造用バンクを別に作成することもできます。

  4. これらのSoundBankを生成して、生成されたSoundBankフォルダを、ゲームアプリケーションにコピーする。

    [注釈] 注釈

    1つのSoundBankに入っている構造データを、ランタイムに分割することはできません。このため、AK::SoundEngine::PrepareEventを使っている時に、他のSoundBankに入っている構造データが必要になると、そのSoundBankに入っている全ての構造データが、同時にロードされます。事前にプロジェクトの構造データを複数のSoundBankに分割すれば、メモリにロードされてしまう不要な情報の量を抑えることができます。

ゲーム中にイベントをプリペアするには:

  1. ゲームの最初にイベントのSoundBankをロードして、イベントのプリペア(用意)を、そのイベントがゲームで必要となった時に行う。関連する構造やメディアは、自動的にロードされる。

    ゲーム中にイベントをプリペアする方法として、以下のサンプルコードを参照。

                  
                  // Initializing the sound engine. 
    
                  AkInitSettings initSettings;
                  AkPlatformInitSettings platformInitSettings;
                  AK::SoundEngine::GetDefaultInitSettings( initSettings ):
                  AK::SoundEngine::GetDefaultPlatformInitSettings( platformInitSettings ):
    
                  // Set the required settings. 
    
                  ...
    
                  // Set PrepareEvent related settings. 
                  initSettings.bEnableGameSyncPreparation = false; // Not used in the current sample. 
    
                  // (Optional) Allocate a memory pool into which prepared media will be loaded. 
                  // If this is not done, memory will be allocated directly in the default memory pool. 
                  {
                    initSettings.uPrepareEventMemoryPoolID = AK.MemoryMgr.CreatePool( NULL, 4*1024*1024, 1024, AkMalloc );
    
                    // (Optional) Give the memory pool a name. This can be very useful for profiling. 
                    AK::MemoryMgr::SetPoolName( initSettings.uPrepareEventMemoryPoolID, L"PrepareEventPool" );
                  }
    
                  AKRESULT eResult = AK.SoundEngine.Init( initSettings, platformInitSettings );
                  if( eResult != AK_Success )
                  {
                    // Handle error. 
                  }
    
                  // Load Init bank and the event/structure bank. 
                  AkBankID    bankID;  // Not used in the sample. 
                  AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", AK_DEFAULT_POOL_ID, bankID );
                  if( eResult == AK_Success )
                  {
                    eResult = AK::SoundEngine::LoadBank( L"Events.bnk", AK_DEFAULT_POOL_ID, bankID );
                  }
    
                  ...
    
                  // And then, at various points in the code:
    
                  AkLpCtstr pEventsNameArray[1] = { L"My_Event_Name" };
    
                  // Preparing an event:
                  eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pEventsNameArray, 1 ); // 1 is the array size. 
    
                  // Unpreparing an event:
                  eResult = AK::SoundEngine::PrepareEvent( Preparation_Unload, pEventsNameArray, 1 ); // 1 is the array size. 
                

その他

AK::SoundEngine::PrepareEvent() の呼び出し(Call)は、I/Oファンクションの呼び出しとして扱われます。前例では、ブロッキングファンクション(Blocking function)を使いました。AK::SoundEngine::PrepareEvent()ファンクションの他のオーバーロードを使い、ノンブロッキングコール(Non-blocking calls)にして、別のコールバックで、完了ノティフィケーション(Completion notification)を回復(Revive)できます。

Action Eventをプリペアする、メリットとデメリットを、下表に示す。

メリット

デメリット

SoundBankの生成プロセスがシンプルである。

メディアの分割レベルが非常に細かい。

全体的なメモリの節約を維持できる。

プロセスを自動化しやすい。

メディアアセットを1つ1つロードするため、ディスクの読み込みとシークの回数が増える可能性がある。

使用されるメモリの合計量の制御が減少します。

Interactive Music の操作は複雑になります。


このページはお役に立ちましたか?

サポートは必要ですか?

ご質問や問題、ご不明点はございますか?お気軽にお問い合わせください。

サポートページをご確認ください

あなたのプロジェクトについて教えてください。ご不明な点はありませんか。

プロジェクトを登録していただくことで、ご利用開始のサポートをいたします。

Wwiseからはじめよう