버전
menu_open

방법 4: Action Event 준비하기

이 방법은 다음과 같은 상황에 적용할 수 있습니다.

  • 메모리 사용량을 낮게 유지하기 위해서 아주 작은 수준의 세분성이 필요할 경우.

  • 어떤 미디어 에셋이 어떤 SoundBank에 할당되어야 하는지 굳이 걱정하지 않고 싶을 경우.

준비된 Action Event란 정확히 무엇일까요? PrepareEvent() 기능을 호출할 경우 시스템은 Action Event를 분석해서 이 Event에 연관된 모든 구조와 미디어가 메모리에 올라갔는지 확인합니다. 모든 내용이 메모리에 올라가지 않았을 경우 시스템은 누락된 정보를 자동으로 디스크에서 스트리밍합니다. Event는 명시적으로 준비 해제하기 전까지 항상 준비된 상태로 유지됩니다.

[참고] 참고

Action Event만 미리 준비할 수 있습니다. 'PrepareEvent' 방법은 Dialogue Event에 사용할 수 없습니다.

이 방법을 사용하려면 적어도 하나의 SoundBank가 필요합니다. 하지만 구조 부분은 Event와 동일한 SoundBank에 들어가거나 완전히 별도의 SoundBank에 들어갈 수 있습니다.

PrepareEvent 장치를 사용할 SoundBank를 제작할 경우, 필요한 모든 Event와 구조가 적어도 하나의 SoundBank에 있어야 하며 파일 시스템이 반드시 루스 미디어(loose media) 에셋에 접근할 수 있어야 합니다. 단, 구조를 여러 개의 SoundBank로 분할하는 것이 더 효율적인 메모리 관리일 수 있다는 점을 기억하세요.

Action Event를 준비하기 전에는 반드시 하나의 SoundBank에서 Event 자체가 메모리로 올라가야 합니다 (LoadBank()를 통해). 그 이유는 바로 이 Event가 Event를 준비할 때 필요한 의존성에 대한 정보를 담고 있기 때문입니다.

[참고] 참고

또한 AK::SoundEngine::PrepareBank 기능을 결합시켜 Event를 준비할 수도 있습니다. PrepareBank 장치를 사용하는 것의 가장 주된 장점은 바로 SoundBank를 'Event 뱅크'와 'Media 뱅크'로 나누지 않아도 된다는 점입니다. 이 방법을 사용하면 모든 콘텐츠가 동일한 SoundBank에 담기지만, AK::SoundEngine::PrepareBank가 호출되면 SoundBank의 메타데이터 콘텐츠만 메모리에 올라갑니다. 게임에서 미디어가 필요할 경우 PrepareEvent를 사용하여 미디어를 불러오면 됩니다.

Event를 준비할 때 Wwise에서 SoundBank를 설정하는 방법:

  1. 'Events'라고 불리는 SoundBank를 만든 후 SoundBank Editor에 불러옵니다.

  2. 프로젝트에서 몇 가지 Action Event를 'Event' SoundBank에 추가하거나 Event Work Unit에 추가합니다.

  3. Media 체크 상자를 비활성화하여 EventsStructures 체크 상자만 활성화되도록 합니다. PrepareEvent()를 사용할 경우 미디어가 반드시 SoundBank 안에 있어야 하지만 직접 디스크에서 루스 파일(loose file)로 로딩되어야 합니다.

    [참고] 참고

    이 예시에서는 모든 Event와 구조가 한 SoundBank에 담겨 있습니다. 소규모 프로젝트에서는 이렇게 해도 괜찮지만 대부분의 경우 콘텐츠를 여러 개의 SoundBank로 분할하는 것이 좋습니다. 또한 각 Event가 불러올 필요가 없는 다른 SoundBank를 참조하기 때문에 SDK 명령을 통해 명시적으로 불러오거나 준비하지 않아도 되는 'Structures' SoundBank를 만들 수도 있습니다.

  4. SoundBank를 생성한 다음 생성된 SoundBank 폴더를 게임 애플리케이션에 복사합니다.

    [참고] 참고

    한 SoundBank에 담긴 구조 데이터는 런타임 때 분할할 수 없습니다. 그렇기 때문에 AK::SoundEngine::PrepareEvent()를 사용할 경우 별도의 SoundBank에서 구조 데이터가 필요하게 되면 해당 SoundBank의 모든 구조가 동시에 로딩됩니다. 이러한 이유로 프로젝트의 구조 콘텐츠를 여러 개의 SoundBank로 분할해서 메모리에 올라간 불필요한 정보의 양을 최소화하는 것이 좋을 수 있습니다.

게임에서 Event를 준비하는 방법:

  1. 게임에서 초기에 Event의 SoundBank를 불러옵니다. 그리고 게임에서 필요로 할 때 이 Event를 준비합니다. 그러면 해당 구조와 미디어도 자동으로 로딩됩니다.

    다음 코드는 게임에서 Event를 준비하는 방법을 알려줍니다.

                  
                  // 사운드 엔진을 초기화합니다. 
    
                  AkInitSettings initSettings;
                  AkPlatformInitSettings platformInitSettings;
                  AK::SoundEngine::GetDefaultInitSettings( initSettings ):
                  AK::SoundEngine::GetDefaultPlatformInitSettings( platformInitSettings ):
    
                  // 필요한 설정 사항을 설정합니다. 
    
                  ...
    
                  // PrepareEvent에 관한 설정 사항을 설정합니다. 
                  initSettings.bEnableGameSyncPreparation = false; // 이 샘플에서는 사용되지 않습니다. 
    
                  // (선택 사항) 준비된 미디어가 로드될 메모리 풀을 배정합니다. 
                  // 이 작업을 실행하지 않으면 메모리가 기본 메모리 풀로 직접 배정됩니다. 
                  {
                    initSettings.uPrepareEventMemoryPoolID = AK.MemoryMgr.CreatePool( NULL, 4*1024*1024, 1024, AkMalloc );
    
                    // (선택적) 메모리 풀에 이름을 지정합니다. 이름을 지정하면 프로파일링 시에 유용합니다. 
                    AK::MemoryMgr::SetPoolName( initSettings.uPrepareEventMemoryPoolID, L"PrepareEventPool" );
                  }
    
                  AKRESULT eResult = AK.SoundEngine.Init( initSettings, platformInitSettings );
                  if( eResult != AK_Success )
                  {
                    // 오류 사항을 처리합니다. 
                  }
    
                  // Init 뱅크와 이벤트/구조 뱅크를 불러옵니다. 
                  AkBankID    bankID;  // 이 샘플에서는 사용되지 않습니다. 
                  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 );
                  }
    
                  ...
    
                  // 그 다음 코드의 여러 지점에서 다음 내용을 배치합니다.
    
                  AkLpCtstr pEventsNameArray[1] = { L"My_Event_Name" };
    
                  // 이벤트를 준비합니다.
                  eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pEventsNameArray, 1 ); // 1은 어레이 크기입니다. 
    
                  // 이벤트를 준비 해제합니다.
                  eResult = AK::SoundEngine::PrepareEvent( Preparation_Unload, pEventsNameArray, 1 ); // 1은 어레이 크기입니다. 
                

이 방법에 대한 추가 정보

AK::SoundEngine::PrepareEvent() 호출은 반드시 I/O 기능 호출로 간주되어야 한다는 점을 주의하세요. 이전 예시에서는 차단(blocking) 기능을 사용했습니다. AK::SoundEngine::PrepareEvent() 기능의 다른 중복 정의(overload)를 사용하여 차단하지 않는 호출을 만든 후 별도의 콜백을 통해 완료 알람을 다시 회복시킬 수 있습니다.

다음 표에서는 Action Event 준비의 장단점을 설명합니다.

장점

단점

SoundBank 생성 과정이 간단합니다.

미디어의 세분성이 아주 작습니다.

전반적으로 메모리 사용량이 낮게 유지됩니다.

처리 자동화가 쉽습니다.

미디어 에셋이 하나씩 로딩되면서 디스크 읽기와 빠른이동의 횟수가 잠재적으로 증가할 수 있습니다.

총 메모리 사용량에 대한 통제력이 줄어듭니다.

Interactive Music을 사용하기가 더 복잡해집니다.


이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요