Event-Based Packaging(이벤트 기반 패키징)이란 무엇일까요?
얼마 전에 Wwise 2019.2 UE4 통합은 Event-Based Packaging(이벤트 기반 패키징, 줄여서 EBP)이라는 새로운 에셋 관리 작업 과정을 소개했습니다. 기존의 SoundBank 작업 과정과 비교했을 때 이 새로운 파이프라인은 각 이벤트의 리소스가 개별적인 SoundBank로 패키징되는 이벤트 패키징이라는 특징을 가지고 있습니다.
EBP를 사용하는 게 왜 필요할까요? 그 이유는 바로 Wwise 기존의 파이프라인의 경우 사용자의 재량에 따라 직접 SoundBank를 구성해야 하기 때문입니다. 대규모 프로젝트의 경우 정리하는 데 시간이 꽤 걸릴 수 있습니다. 그리고 사운드뱅크를 수동적으로 구성하고 관리하기 때문에 리소스를 로드할 때 중복이 거의 불가피하죠. 새로운 EBP 작업 과정에서는 각 이벤트에 해당하는 리소스가 자동으로 SoundBank로 패키징되며 이벤트의 .uasset
에 저장됩니다. 이벤트가 호출되면 해당 미디어 리소스가 로드되며, 필요한 리소스만 효율적으로 로드합니다. 즉, 리소스 중복이 일어날 가능성을 근본적으로 제거하게 됩니다. 그리고 각 SoundBank
가 한 이벤트의 리소스만 담기 때문에 다른 이벤트가 리소스에 접근할 수 없을 경우를 걱정하지 않고 자유롭게 언로드할 수 있습니다.
이 글은 EBP 작업 과정과 로드 과정에 사용되는 주요 리소스 몇 개를 소개하고 모든 분들이 새로운 파이프라인을 좀 더 쉽게 이해하도록 작성되었습니다.
EBP와 WAAPI
UE4에서 이벤트를 기반으로 한 자동 패키징을 작동하려면 Event와 Event와 사운드 미디어 간의 관계를 반드시 가지고 있어야 합니다. 이 과정에서 EBP 파이프라인은 WAAPI를 사용합니다. WAAPI(Wwise Authoring API, 와이즈 저작 API)는 외부 애플리케이션이 Wwise Authoring 도구와 통신할 수 있도록 해주는 API입니다. 사용자는 이 API를 통해 Wwise Authoring 도구를 제어할 수 있기 때문에 WAAPI는 UE4 프로젝트와 Wwise 프로젝트 간의 다리 역할을 한다고도 할 수 있죠.
Wwise 저작 도구에서 Event를 생성하면 UE4 통합은 콜백 함수를 통한 작동 지시를 수신한 후 해당하는 event.uasset
을 자동으로 생성합니다. 마찬가지로 사용자가 UE4에 있는 WAAPI Picker 패널에서 Generate Sound Data 버튼을 클릭하면 Wwise Authoring 도구가 Generate SoundBanks 작업을 실행합니다. EPB 작업 과정에서 WAAPI는 UE4와 Wwise 프로젝트가 항상 동기화되도록 해주는 역할을 합니다.
WAAPI를 통해 Wwise에 연결하여 SoundBank를 생성하는 방법을 권장하긴 하지만 그렇다고 Sound Data를 생성하는 유일한 방법인 것은 아닙니다. WAAPI를 사용하여 Wwise Authoring 도구에 연결하지 못할 경우 Wwise Picker 창에서 Generate Sound Data 버튼을 클릭하면 Wwise Console을 사용하여 생성 과정을 시작할 수 있습니다. 이 경우 시스템 I/O 호출을 더 많이 사용하기 때문에 WAAPI에 비해 생성 속도가 느리지만 결과적인 에셋은 똑같습니다. 또한 Unreal의 Build 메뉴에 있는 Audiokinetic 섹션에서 Generate Sound Data 대화창을 열 수도 있습니다.
UE4에서의 Wwise 리소스
사운드 개발 과정에서 사용자는 Wwise에서 Event, State, Switch, RTPC, Bank, Auxiliary Bus, Media 리소스를 사용하여 프로젝트에서 소리 세계를 제작할 수 있습니다. UE4에서 이러한 리소스는 모두 .uasset의 형식으로 존재하며 기본적으로 Content/WwiseAudio/
폴더에 저장됩니다. 프로젝트의 Wwise 리소스의 위치는 UE4 Project Settings의 Wwise Integration Settings 섹션에서 'Wwise Sound Data Folder' 설정을 변경하여 설정할 수 있습니다.
다음 표는 Wwise 리소스에 해당하는 클래스와 UE4에서 저장되는 위치를 열거합니다:
종류 | 클래스 | 경로 |
Bank | UAkAudioBank | Content/ |
RTPC | UAkRtpc | Content/WwiseAudio/Game_Parameters/ |
State | UAkStateValue | Content/WwiseAudio/States/ |
Switch | UAkSwitchValue | Content/WwiseAudio/Switches/ |
Event | UAkAudioEvent | Content/WwiseAudio/Events/ |
InitBank | UAkInitBank | Content/WwiseAudio/ |
Auxiliary Bus | UAkAuxBus | Content/WwiseAudio/Master-Mixer_Hierarchy/ |
AcousticTexture | UAkAcousticTexture | Content/WwiseAudio/Virtual_Acoustics/ |
Media | UAkMediaAsset | Content/WwiseAudio/Media/ |
ExternalSource | UAkExternalMediaAsset | Content/WwiseAudio/ExternalSources/ |
Localized | UAkLocalizedMediaAsset | Content/WwiseAudio/Localized/ |
Wwise
위의 리소스로부터 파생된 파생 클래스는 오브젝트로 전환되기 위해 다시 직렬화되어야 합니다. 역직렬화(deserialization)는 바이트(byte) 스트림을 메모리 안의 오브젝트로 변환하는 과정을 말합니다. 다음 그림은 모든 Wwise 리소스의 클래스 표입니다. 모든 리소스의 파생을 확인할 수 있습니다.
게임에서 개발자는 리소스 참조와 C++ 코드를 통해 이러한 클래스를 로드할 수 있습니다. 씬으로 드래그하여 놓여진 오브젝트나 Component 속성을 통해 참조되는 리소스의 경우 Component 오브젝트가 인스턴스화되면 그 안에 있는 Wwise 리소스가 로드됩니다. 뿐만 아니라 이 리소스는 UE4에서 LoadObject()
함수를 통해 호출할 수도 있습니다.
에디터에서 UAKAudioType
클래스로부터 파생된 리소스 로딩은 AkAssetDatabase
클래스에 의해 완료되며 해당 생성자(constructor)는 onAssetAdded
, onAssetRemoved
onAssetRenamed
라는 세 가지 이벤트를 등록하게 됩니다. 이 중에서 onAssetAdded
는 모든 리소스 로딩을 처리합니다. 사실 UE4 엔진 에디터를 열면 현재 맵의 모든 Wwise 리소스가 로드됩니다.
media.uasset
의 로딩은 event.uasset
의 인스턴스화와 함께 실행됩니다. 이 부분은 후반부의 로딩 과정 섹션에서 더 자세하게 설명해드리겠습니다. 다음으로 가장 중요한 두 가지 리소스인 events.uasset
과 media.uasset
을 살펴봅시다.
Event-Based Packaging 과정 개요
사용자가 가장 많이 상호작용하는 리소스는 게임에서의 다양한 이벤트입니다. Wwise Authoring 도구의 이벤트와 UE4의 event.uasset
리소스는 1:1 관계로 연결돼있습니다. 이벤트는 재생, 일시 중지, Switch나 State 설정과 같은 동작을 실행하는 데에 사용됩니다. EBP에서 각 event.uasset
는 Wwise 프로젝트에서 정의한 모든 플랫폼에 대한 Event의 콘텐츠를 담습니다. 여기서 주요 정보는 Event가 종속된 SoundBank와 미디어 리소스 경로입니다. SoundBank 안에는 리소스 자체가 아니라 Event와 Structure 데이터만 있기 때문에 event.uasset
파일 크기는 몇 KB밖에 되지 않습니다. 미디어 리소스 경로는 미디어 리소스를 찾고 로드하기 위한 기반이 됩니다.
media.uasset에 들어있는 내용
경우에 따라 서로 다른 Event가 동일한 오디오 파일을 참조하기도 합니다. 아주 흔한 상황이긴 하지만 리소스 중복을 일으킬 수 있죠. event.uasset
간의 사운드 파일 공유를 구현하기 위해서 모든 미디어는 SoundBank에서 분리되어 기본적으로 Content\WwiseAudio\Media\
폴더 안에 별도로 저장됩니다. Wwise Authoring 도구에서 사용되는 구성 방법에 따르면 Event에 연관된 각 Audio Source는 media.uasset
파일과 상응합니다. event.uasset에서 설명되었듯이 media.uasset
파일은 모든 플랫폼용 콘텐츠를 한 파일에 담고 있습니다. 사용자가 새로운 플랫폼을 추가하면 media.uasset
의 파일 크기는 플랫폼의 미디어가 파일에 추가됨에 따라 증가합니다.
미디어 리소스의 이름은 ID로 지정됩니다. 해당하는 MediaName
을 찾고자 할 경우 UE4의 Content Browser에서 Content\WwiseAudio\Media
를 찾아서 Columns에 표시할 수 있습니다.
Wwise 리소스의 로딩 과정
이제 가장 중요한 두 가지 리소스인 event.uasset과 media.uasset의 내용을 이해했으니 이 리소스를 로드하는 단계를 살펴봅시다. SoundBank
와 미디어는 별도로 저장되기 때문에 리소스를 로드할 경우 먼저 SoundBank를 로드한 다음 이 사운드뱅크가 참조하는 미디어를 로드해야 합니다.
Soundbank 로드하기
Wwise를 사용할 때 이벤트가 필요로 하는 SoundBank는 반드시 PostEvent
가 로드되기 전에 로드되어야 합니다. 마찬가지로 EBP에서도 그래야 하죠. event.uasset
의 로딩 과정 도중 SoundBank
, 즉 모든 Event와 Structure가 는 자동으로 로드됩니다. 여기서 기억해야 할 점은, EBP의 경우 event.uasset
이 인스턴스화될 때 SoundBank
가 이미 메모리에 로드되었기 때문에 로드된 SoundBank는 Wwise가 예약한 메모리가 아니라 UE4가 예약한 메모리에 있다는 것입니다. Sound Engine은 SoundBank를 로드하는 AK::SoundEngine::LoadBankMemoryView()
함수의 전달인자로서 메모리 주소를 받습니다.
필요한 미디어 로드하기
SoundBank 로딩이 끝나면 media.uasset
도 로드됩니다. 이 단계에서는 event.uasset
에서 저장된 미디어 리소스 경로를 통해 미디어를 로드합니다. 그렇기 때문에 SoundBank처럼 UE4가 예약한 메모리에 있는 것이죠.
EBP 파이프라인은 미디어를 로드하는 데에 PrepareEvent
를 사용하지 않습니다. 대신 SetMedia()
함수를 통해 SoundEngine에 미디어 리소스의 위치를 제공합니다. 각 media.uasset
은 단 한 번만 인스턴스화되기 때문에 데이터가 중복적으로 로드되는 것을 염려하지 않아도 됩니다.
요약
이 글은 EBP 에셋 관리 작업 과정과 로딩 과정에서 사용되는 주요 리소스를 소개하여 사용자가 이 파이프라인의 구성을 이해하는데 도움을 주기 위해 작성되었습니다. 상대적으로 새로운 이 EBP 파잎프라인은 추후 출시를 통해 계속해서 업데이트되고 개선되기 때문에 이 글에서 다룬 내용이 변경될 수 있습니다. 그래도 SoundBank의 자동화된 관리가 시간뿐만 아니라 게임 오디오 개발 과정의 비용을 상당히 줄여준다는 사실은 변함이 없으리라 믿습니다. 앞으로 이 파이프라인이 더욱 성숙되고 곧 안정화되면 더 많은 게임 개발자들에게 도움이 되기를 바랍니다.
댓글