목차

일반 정보

뱅크의 타입

모든 프로젝트에는 두 가지 뱅크 타입인 초기화 뱅크와 SoundBank가 존재합니다.

초기화 뱅크

각 프로젝트는 하나의 초기화 뱅크가 존재합니다. 해당 뱅크는 Wwise가 SoundBank를 생성할 때 자동으로 생성되며 "Init.bnk"라는 이름을 갖습니다. 이 특별한 뱅크는 다음과 같은 일반적인 프로젝트 정보를 담고 있습니다.

  • 버스 계층구조
  • State
  • Switch
  • RTPC
  • Bus Effect

초기화 뱅크는 언어 독립적이라 모든 언어에 대해서 하나만 생성됩니다.

초기화 뱅크는 게임을 시작할 때 반드시 맨 먼저 로드되는 뱅크여야 합니다. 첫 번째로 로드되지 않으면, SoundBank가 로드되지 않을 것입니다. 이미 다른 SoundBank가 로드되어 있으면 초기화 뱅크는 언로드 할 수 없습니다. 초기화 뱅크는 SoundBank와 같은 방식으로 로드됩니다.

Note.gif
참고: 음향 소스 또는 효과, 코덱 플러그인을 사용하는 프로젝트에서 필요한 플러그인이 사운드 엔진에 미리 등록되어 있지 않으면 초기화 뱅크의 로딩은 실패하게 됩니다. 플러그인 등록에 관한 정보는 통합 세부사항 - 플러그인코덱 플러그인의 통합 을 참고하세요.

SoundBank

각각의 SoundBank는 다음을 포함합니다.

  • 이벤트 정의
  • 사운드 구조체 정보 (사운드, 컨테이너, 뮤직 객체, 액터-믹서 등)
  • 미디어
    • 사운드 데이터 (메모리 내 사운드)
    • 프리페치된 사운드 데이터 (지연이 없는 스트림된 사운드)
    • 스트림된 사운드 파일의 레퍼런스 (파일 ID)

초기화 뱅크가 로드되고 나서, SoundBank는 게임이 진행되는 동안 자유롭게 로드되거나 언로드될 수 있습니다. 이벤트를 포함하는 뱅크에서 해당 이벤트가 트리거되기 전에 로드되도록 보장하는 것은 작업자의 책임입니다. 만약, 해당 뱅크가 로드되기 전에 이벤트가 발생하면 해당 이벤트는 실행되지 않습니다.

Caution.gif
경고: SoundBank는 초기화 뱅크에 저장된 정보가 필요합니다. 따라서 게임은 같은 Wwise 프로젝트에서 생성된 초기화 뱅크와 SoundBank를 사용해야 합니다.

ID나 문자열 (유니코드나 ANSI)의 사용

SDK는 뱅크 내의 구성 요소에 접근하는 두 가지 방법으로 문자열 또는 ID의 사용을 제공합니다. 게임에서 어떤 방식을 사용할지 결정하기 전에 고려해야 할 사항으로 다음과 같은 몇 가지가 있습니다.

  • 읽기 쉬운 코드를 가져야 하는 중요성
  • 개발 환경의 다른 부분에서 문자열의 사용
  • CPU의 사용량
  • 메모리의 사용량

문자열의 사용

  • 코드를 더욱 읽기 쉽게 만들어 개발을 쉽게 만들어 줍니다.
  • 기본적으로 문자열을 사용하는 개발환경에 적합합니다.
  • 문자열을 사운드 엔진에서 사용하는 ID로 변환하는 데에는 적은 양의 CPU가 요구됩니다. 대부분 게임은 문자열 천 개를 프레임당 변환해도 CPU 사용량의 차이를 잘 느끼지 못합니다.
  • 문자열은 사운드 엔진에 저장되지 않습니다. 그래서 문자열들이 게임 엔진에서 이미 사용 중이라면 메모리를 추가적으로 사용하지 않게 됩니다. 그러나 게임에서 문자열을 사용하지 않는다면, 변환하기 전에 문자열을 저장하도록 일부 메모리가 게임에서 사용됩니다.

ID의 사용

  • 코드를 좀 더 읽기 어렵게 만들어, 개발 중에 문제 해결을 더 어렵게 만듭니다.
  • 사운드 엔진 내부에서 ID를 사용하기 때문에 어떠한 추가 CPU 사용도 요구하지 않습니다.
  • 추가 메모리를 요구하지 않습니다.

대부분의 경우에서는 문자열을 사용하여 진행할 수 있는데, 게임이 메모리와 CPU 측면에서 충분하지 않으면 ID의 사용을 고려하게 됩니다.

문자열 변환

게임에서 이용 가능한 모든 Wwise 객체의 ID (뱅크, 이벤트, 게임 싱크 등)는 소문자 이름을 32-bit 정수로 해시하여 계산됩니다.

Tip.gif
작은 정보: Wwise에서 Project Settings 대화상자의 SoundBanks 탭에서 ‘Generate SoundBank content files’ 옵션을 선택해 각 뱅크에 대응하는 텍스트 파일을 생성하게 됩니다. 이 파일은 포함하고 있는 모든 객체의 이름과 ID를 나열합니다. SoundBank 프로젝트 설정 의 세부 내용에 대해 Wwise Help를 참고하세요.

AK::SoundEngine::GetIDFromString() 메소드는 문자열을 ID로 런타임 변환을 수행합니다. 이는 대소문자를 구분하지 않습니다. 입력 문자열은 소문자로 변환되어 해시 함수가 적용됩니다.

예제: 유니코드 문자열의 사용

이름으로 식별하는 이벤트를 전송하려고 합니다. 첫 번째 인자로 문자열을 갖는 AK::SoundEngine::PostEvent() 의 오버로드 함수를 사용할 수 있습니다.

Note.gif
참고: 사운드 엔진은 내부적으로 유니코드 문자열을 ID로 변환하고 나서 첫 번째 인자값으로 ID를 갖는 PostEvent()의 오버로드 함수를 호출합니다. 문자열과 ID 오버로드 함수를 모두 갖는 SDK의 모든 메소드는 이처럼 작동합니다. 단, AK::SoundEngine::LoadBank() 오버로드 함수는 장치 I/O와 관련있어서 제외합니다. 이에 대해 뱅크의 식별 섹션에서 설명하고 있습니다.
AkGameObjectID gameObj = 3;
AK::SoundEngine::RegisterGameObj( gameObj );

AkPlayingID playingID = AK::SoundEngine::PostEvent(
    L"Play_Sound_01",                   // 이벤트 이름 (대소문자 구분 안 함)
    gameObj                             // 연관된 게임 오브젝트 ID
    );

ID 사용 활성화

런타임에서 문자열을 ID로 변환 없이 해당 ID로 직접 작업을 진행하려면, 뱅크는 ‘Generate header file’ 옵션이 선택되어 생성되어야 합니다. 해당 옵션은 Wwise에서 Project Settings 대화상자의 SoundBanks 탭에 있습니다. Wwise_IDs.h라는 이름의 헤더 파일은 요구되는 모든 ID를 포함하며, 게임에 포함되어야 합니다. 해당 파일은 뱅크가 생성될 때마다 갱신됩니다.

Wwise에서 뱅크 생성과 관련해 더 많은 정보는 Wwise Help를 참고하세요.

여기 아주 간단한 Wwise로 생성된 헤더 파일에 대한 예제가 있습니다.

///////////////////////////////////////////////////////////////////////
//
// Audiokinetic Wwise가 생성한 include 파일. 수정하면 안 됩니다.
//
//////////////////////////////////////////////////////////////////////

#ifndef __WWISE_IDS_H__
#define __WWISE_IDS_H__ 

namespace AK
{
    namespace EVENTS
    {
        static const AkUniqueID PLAY_SOUND_01 = 2580655723U;
        static const AkUniqueID PLAY_SOUND_02 = 2580655720U;
        static const AkUniqueID PLAY_SOUND_03 = 2580655721U;
    } // 네임스페이스 EVENTS
    
    namespace BANKS
    {
        static const AkUniqueID INIT = 1355168291U;
        static const AkUniqueID BANK_01 = 1576947084U;
        static const AkUniqueID BANK_02 = 1819748216U;
    } // 네임스페이스 BANKS
} // 네임스페이스 AK

#endif // __WWISE_IDS_H__ 

Wwise에 의해 생성된 헤더 파일은 일반적으로 위에 나온 코드보다 더 많은 정보를 담고 있습니다. 그 이유는 항목들이 모든 뱅크, 이벤트, 상태, 스위치 등에 대해서 추가되기 때문입니다.

Caution.gif
경고: ID로 작업을 진행하는 동안에는 새로운 뱅크가 생성될 때마다 .h 파일을 최신 상태로 유지하는 게 중요합니다. 그렇지 않으면, ID가 맞지 않거나 컴파일 오류가 발생하게 됩니다.

예제: ID의 사용

ID를 사용해 이벤트를 발송하려고 합니다. 생성된 헤더 파일 ‘Wwise_IDs.h’를 반드시 포함해야 합니다. 단순히 첫 번째 인자값으로 ID를 사용하는 PostEvent() 오버로드 함수를 사용합니다.

#include "Wwise_IDs.h" 

// ...

AkGameObjectID gameObj = 3;
AK::SoundEngine::RegisterGameObj( gameObj );

AkPlayingID playingID = AK::SoundEngine::PostEvent(
    AK::EVENTS::PLAY_SOUND_01,          // 이벤트의 고유 ID
    gameObj                             // 연관된 게임 오브젝트 ID
    );

뱅크의 식별

게임에서의 모든 Wwise 오브젝트처럼, 뱅크는 이름을 해시해서 생성된 ID로 식별합니다. 뱅크의 로드와 언로드는 특정 시점에서 I/O 장치로의 접근을 요구합니다.

메모리에서 뱅크 로드

AK::SoundEngine::LoadBank() 오버로드 함수 중 하나는 포인터와 크기를 사용합니다. 사용자의 I/O를 작동시키려고 할 때 사용하며 콘텐츠를 준비하려 한다는 걸 사운드 엔진에 알려줍니다. 포인터는 뱅크가 언로드될 때까지 반드시 유효해야 합니다.

뱅크 ID는 뱅크에 저장됩니다. AK::SoundEngine::LoadBank() 의 메모리 오버로드 함수는 이를 파싱해서 반환합니다. 뱅크를 언로드하기 위해(AK::SoundEngine::UnloadBank() 의 ID 오버로드 함수를 사용) 해당 반환 값을 가지고 있어야 합니다.

파일 시스템에서 뱅크의 로드

Wwise 사운드 엔진은 절대로 I/O에 직접 접근하지 않습니다. 모든 I/O 요청은 AK::IAkStreamMgr 로 정의된 인터페이스인 스트림 매니저를 통해 실행됩니다. ( 스트리밍 / 스트림 매니저 를 참고) 해당 모듈은 오버라이드될 수 있는데, Audiokinetic의 기본 구현에서 더 나아가 I/O 전송과 파일 시스템 및 하위-레벨 I/O 모듈에 접근하는 하위-레벨을 위한 추상화를 정의해야 합니다. 하위-레벨 I/O 모듈은 AK::IAkLowLevelIO 로 정의되어 있으며, Audiokinetic의 AK::IAkStreamMgr 구현으로 정의된 인터페이스입니다. 하위-레벨 IO의 기본 구현을 제공하나, 자신이 직접 구현을 통해 교체할 수 있음을 의미합니다. 즉, 파일 위치 결정이 가능합니다 ( Low-Level I/O 참고).

스트림 매니저와 하위-레벨 IO는 문자열 또는 ID로 파일을 열도록 2개의 오버로드 함수를 정의합니다. 유사하게 사운드 엔진 API는 문자열이나 ID를 사용하는 LoadBank()의 오버로드 함수를 제공합니다. 사운드 엔진에 의해 호출되는 AK::IAkLowLevelIO::Open() 의 형태는 게임에서 어떤 LoadBank() 오버라이드를 사용했는지에 따라 달라집니다. 또한, SoundBank에서 Project Settings 대화상자의 SoundBanks 탭에 위치한 "Use SoundBank names" 옵션을 사용하여 생성했는지에 따라서도 달라집니다. SoundBank 프로젝트 설정 의 세부 내용에 대해 Wwise Help를 참고하세요.

SoundBank 이름 사용하기

Wwise에서 SoundBank를 생성하기 위해서 사용 가능한 설정 중 하나로 "Use SoundBank names" 옵션이 있습니다. 이 옵션은 사운드 엔진에서 I/O 및 파일 시스템과 관련하여 뱅크를 어떻게 로드할지에 영향을 줍니다.

Warning.gif

주의: SDK에서 제공된 하위-레벨 IO의 기본 구현 사용(CAkDefaultLowLevelIO, 기본 Low-Level I/O 구현 를 참고)은 다음 제한사항이 적용됩니다.

  • Use SoundBank names 가 선택되어 있으면, 이름 기반의 LoadBank() 버전(하나의 문자열 매개 변수로)만 동작합니다.
  • Use SoundBank names 가 선택되지 않으면, ID 기반의 LoadBank() 버전(하나의 AkBankID 매개 변수로)만 동작합니다.

그러나 파일 패키지 기반의 하위-레벨 IO를 사용하면(CAkFilePackageLowLevelIO, 예제 파일 패키지 Low-Level I/O 구현 설명 참조), Use SoundBank names를 설정했어도 LoadBank()의 오버라이드 함수 둘 다 사용할 수 있습니다.

"Use SoundBank Names" 옵션을 선택하지 않음

해당 옵션이 선택되지 않으면, Wwise는 다음과 같은 형식을 갖는 이름으로 뱅크 파일을 생성합니다.

  • ID.bnk.

"ID"는 숫자입니다. 뱅크의 이름을 해쉬(AK::SoundEngine::GetIDFromString() 참조)해서 생성된 32-bit ID입니다.

해당 모드에서 뱅크는 ID를 사용해 다른 뱅크를 내부적으로 참조합니다. (해당 이름은 참조하기 위해 뱅크에 저장되지 않습니다.) 게다가, PrepareEvent() 명령어로부터 발생한 AK::IAkLowLevelIO::Open() 의 호출은 전부 ID가 쓰이는 버전을 사용합니다. 해당 ID가 유효한 파일 설명자로 결정되는 것은 하위-레벨 IO의 책임입니다.

AK::IAkLowLevelIO::Open() 의 ID를 사용하는 버전에서 SDK가 제공하는 하위-레벨 IO의 기본 구현(CAkDefaultLowLevelIO, 기본 Low-Level I/O 구현 참조)은 ID로 문자열을 생성해 ".bnk"를 첨부하고, 플랫폼에 지정된 네이티브 File Open 메소드를 호출합니다. ( Basic File Location 참조)

Tip.gif
작은 정보: 뱅크 ID는 헤더 파일 Wwise_IDs.h로 사용 가능합니다. - ID 사용 활성화 섹션을 참고

"Use SoundBank Names" 옵션을 선택

해당 옵션이 선택되면 Wwise는 BNK 확장자를 첨부해 기존 이름으로 뱅크 파일을 생성합니다.

뱅크는 참조를 위해 다른 뱅크의 이름을 저장합니다. 사운드 엔진의 Bank Manager가 I/O에서 다른 뱅크를 로드해야 할 때, PrepareEvent() 명령어를 따라 AK::IAkLowLevelIO::Open() 의 문자열 버전을 사용합니다. AK::IAkLowLevelIO::Open() 의 문자열 버전은 ".bnk" 확장자로 연결된 뱅크의 이름을 받습니다. 플랫폼의 파일 시스템에 접근하기 전에 뱅크 위치 경로를 덧붙이거나 어떠한 변환 요구사항을 수행하는 것은 하위-레벨 IO의 책임입니다.

Use SoundBank Names 옵션으로 생성된 뱅크는 조금 크기가 큽니다. 이유는 ID가 아닌 참조되는 뱅크의 이름을 저장해야 하기 때문입니다.

Note.gif
참고: 디스크에 생성된 뱅크 이름과 ID는 SoundBanksInfo.xml 파일에 나열됩니다. - SoundBanksInfo.xml 섹션을 참고
Tip.gif
작은 정보: UnloadBank() 의 문자열 오버로드 메소드에서 문자열은 내부적으로 ID로 변환되며, ID 오버로드 메소드가 호출됩니다. 문자열 오버로드 함수로 뱅크를 로드하고 반환된 연관 뱅크 ID를 유지한 다음, 뱅크를 언로드하기 위해서 해당 ID를 차후에 사용하는 게 가능합니다.

.

언어-전용 ("Voice"와 "Mixed") SoundBank

Wwise가 언어-전용 SoundBank를 생성할 때, 언어-기반 데이터를 가지는 모든 언어에 대해서 같은 ID/파일 이름으로 파일을 생성한다. 이러한 특별한 언어 파일은 따로 언어-전용 폴더에 저장된다. 그러나, 사운드 엔진 API의 뱅크 로드 메소드에는 열어야 할 파일이 어떠한 언어-전용 폴더로부터 지정할 수 있는지에 대한 플래그가 없습니다. 파일 위치는 하위-레벨 IO 또는, 오버라이드를 선택했다면 스트림 매니저에 의해 결정됩니다.

스트림 매니저 API는 파일 I/O로 특정 언어를 지정하는 플래그를 포함하는 스트림 생성을 위한 메소드들을 나타냅니다. 이 플래그는 하위-레벨 IO로 전달됩니다. 더 많은 정보는 File System Flags 를 참고합니다.

사운드 엔진의 Bank Manager는 로드되어야 할 SoundBank가 언어에 특화된 데이터를 포함하지는 지 알지 못하기 때문에, 항상 스트림 매니저에게 먼저 언어에 특화된 폴더에서 찾도록(bIsLanguageSpecificTrue임) 요청합니다. 만약 처리 과정이 실패하면, 뱅크 매니저가 재시도를 하지만, 이번에는 스트림 매니저에게 공용 폴더에서 찾도록 요청합니다.

파일 위치와 관련된 내용은 File Location Resolving 를 참고합니다. 잘못된 위치에서 SoundBank 파일 여는 것을 피하는 방법에 대한 팁과 관련해서 기본 구현(Basic File Location)을 설명하는 과정에 대해 확인해볼 수 있습니다.

스트림된 오디오 파일

뱅크는 항상 참조하게 되는 스트림된 오디오 파일의 ID를 저장합니다. 사운드 엔진이 스트림된 사운드의 재생을 시작하려고 할 때, 뱅크로부터 ID를 구해서 스트림 매니저의 ID 오버로드 함수를 호출합니다. AK::IAkLowLevelIO::Open() 의 ID 오버로드된 함수를 호출해서 처리합니다. 하위-레벨 IO의 기본 구현은 ID로 문자열을 생성하고, 파일 형식에 일치하는 확장자를 연결합니다. 네이밍 스키마를 사용해 생성하고 Generated SoundBanks 폴더에 저장되도록 스트림된 파일의 사본을 원하면, Project Settings 대화 상자의 SoundBanks 탭에서 "Copy Streamed Files" 옵션을 사용합니다. 이러한 작업은 후처리-생성 단계로 정의합니다. 그래서 SoundBank가 생성되자마자 즉시 처리됩니다. SoundBank 프로젝트 설정의 전체 설명은 Wwise 도움말을 참고하세요.

SoundBanksInfo.xml

Wwise에서 뱅크가 생성될 때마다 각 플랫폼에 따른 SoundBanksInfo.xml라는 이름의 파일이 SoundBank 경로에 곧바로 생성됩니다. 이는 주어진 프로젝트의 사운드 엔진에서 요구하는 모든 파일에 대해 나타내는 XML 파일입니다.

이 파일의 내용은 따로 설명이 필요 없을 정도로 명백합니다. 첫 번째 섹션 (StreamedFiles)은 모든 스트림된 오디오 파일과 ID 지정, 원본 이름, 언어, 전체 경로를 나열하고 있습니다. 두 번째 섹션 (SoundBanks)은 뱅크 파일과 동일합니다. 그뿐만 아니라, 각 뱅크는 참조하는 스트림된 오디오 파일을 열거합니다.

뱅크 로딩

뱅크 로딩 API의 전체 설명은 뱅크 로딩 를 참고합니다.

참고: