UE5 오디오 아키텍처
Unreal Engine 5 오디오 엔진의 전체 구조와 렌더링 파이프라인을 이해합니다
Audio Engine Overview
UE5 오디오 엔진의 전체 아키텍처와 핵심 모듈
Unreal Engine 5의 오디오 시스템은 Audio Mixer라는 새로운 렌더링 백엔드를 기반으로 동작합니다. UE4 후반부터 도입된 Audio Mixer는 UE5에서 기본 오디오 렌더러로 자리 잡았으며, 크로스 플랫폼 믹싱, Submix 그래프, 플러그인 아키텍처를 지원합니다.
UE4의 레거시 오디오 엔진은 플랫폼별 네이티브 API(XAudio2, CoreAudio 등)에 직접 의존했습니다. UE5의 Audio Mixer는 플랫폼에 독립적인 소프트웨어 믹서로, 모든 플랫폼에서 일관된 오디오 동작을 보장합니다.
핵심 모듈 구조
| 모듈 | 역할 | 스레드 |
|---|---|---|
| FAudioDevice | 오디오 디바이스 관리, 사운드 재생 요청 처리 | Game Thread |
| Audio::FMixerDevice | 소프트웨어 믹싱 엔진, Source 관리 | Audio Thread |
| FMixerSourceManager | 오디오 소스 풀 관리, 디코딩, 리샘플링 | Audio Render Thread |
| FSubmixGraph | Submix 라우팅 및 이펙트 체인 | Audio Render Thread |
| IAudioMixerPlatformInterface | 플랫폼별 오디오 출력 인터페이스 | Audio Render Thread |
오디오 렌더링 파이프라인
사운드가 재생 요청부터 스피커 출력까지 거치는 전체 과정
UE5의 오디오 렌더링은 멀티스레드 구조로 동작합니다. 게임 스레드에서 재생 요청이 발생하면, 오디오 스레드를 거쳐 오디오 렌더 스레드에서 최종 믹싱이 수행됩니다.
파이프라인 단계
1. 재생 요청
Game Thread에서 UAudioComponent::Play() 또는 UGameplayStatics::PlaySoundAtLocation() 호출
2. 소스 할당
Audio Thread에서 가용 Voice 슬롯 할당. Concurrency/Priority 평가 후 가장 낮은 우선순위 Voice를 교체하거나 재생 거부
3. 디코딩
Audio Render Thread에서 Sound Wave 데이터를 PCM으로 디코딩. 스트리밍 에셋은 청크 단위로 로드
4. DSP 처리
공간화(Spatialization), 감쇠(Attenuation), 이펙트 체인 적용. MetaSounds의 경우 DSP 그래프 전체를 이 단계에서 평가
5. Submix 믹싱
각 소스의 출력을 할당된 Submix로 라우팅. Submix 이펙트(EQ, Reverb, Compressor 등) 적용
6. 최종 출력
Master Submix에서 최종 믹스를 생성하고, 플랫폼 인터페이스를 통해 하드웨어로 전달
오디오 렌더 스레드는 Game Thread와 독립적으로 동작합니다. 따라서 게임 프레임 드롭이 발생해도 오디오 재생은 영향을 받지 않습니다. 단, Game Thread에서의 무거운 오디오 로직(대량의 Play 요청 등)은 피해야 합니다.
Audio Device와 플랫폼 계층
FAudioDevice의 역할과 플랫폼별 오디오 백엔드
FAudioDevice는 UE5 오디오 시스템의 중심 클래스입니다. 하나의 UE5 인스턴스는 여러 개의 Audio Device를 가질 수 있으며(에디터에서는 PIE 세션별로 별도 디바이스 생성), 각 디바이스는 독립적인 리스너와 소스 풀을 관리합니다.
플랫폼별 오디오 백엔드
| 플랫폼 | 백엔드 API | 기본 샘플레이트 | 버퍼 크기 |
|---|---|---|---|
| Windows | XAudio2 / WASAPI | 48,000 Hz | 1024 samples |
| macOS / iOS | CoreAudio | 48,000 Hz | 1024 samples |
| Linux | SDL2 Audio | 48,000 Hz | 1024 samples |
| Android | Oboe (AAudio/OpenSL) | 48,000 Hz | 플랫폼별 가변 |
| PlayStation | Platform SDK | 48,000 Hz | 플랫폼별 가변 |
| Xbox | XAudio2 | 48,000 Hz | 플랫폼별 가변 |
// 현재 월드의 Audio Device 가져오기
if (FAudioDevice* AudioDevice = GetWorld()->GetAudioDevice())
{
// 최대 동시 재생 Voice 수 확인
int32 MaxChannels = AudioDevice->GetMaxChannels();
// 활성 사운드 수 확인
int32 ActiveCount = AudioDevice->GetNumActiveSources();
UE_LOG(LogAudio, Log, TEXT("Max: %d, Active: %d"), MaxChannels, ActiveCount);
}
MaxChannels(프로젝트 설정 > Audio > Max Channels)는 동시에 믹싱할 수 있는 최대 Voice 수입니다. 기본값은 32이며, 모바일에서는 16~24, PC/콘솔에서는 32~64를 권장합니다. 너무 높은 값은 CPU 사용량을 급격히 증가시킵니다.
Sound Cue vs MetaSounds
레거시 시스템과 차세대 시스템의 아키텍처 비교
UE5는 두 가지 오디오 오브젝트 시스템을 지원합니다: 레거시 Sound Cue와 차세대 MetaSounds. 두 시스템은 근본적으로 다른 아키텍처를 가지고 있습니다.
| 항목 | Sound Cue | MetaSounds |
|---|---|---|
| 실행 방식 | 런타임 해석 (Interpreted) | 컴파일된 DSP 그래프 (Compiled) |
| 타이밍 정밀도 | 프레임 단위 | 샘플 단위 (Sample-accurate) |
| 합성 기능 | 없음 (Wave 재생만) | 오실레이터, FM/AM 합성, 그래뉼러 |
| 확장성 | 제한적 (내장 노드만) | C++ Node API로 커스텀 노드 생성 |
| 병렬 처리 | Audio Thread에서 순차 처리 | 각 인스턴스가 독립적으로 병렬 렌더링 |
| 재사용 | Sound Cue 참조만 가능 | MetaSound Patch로 모듈화 |
| 상태 | 레거시 (유지보수 모드) | 활발히 개발 중 (권장) |
Sound Cue는 UE5에서 Deprecated 예정은 아니지만, Epic Games는 새 프로젝트에서 MetaSounds 사용을 공식 권장하고 있습니다. 기존 Sound Cue 에셋은 계속 동작하지만, 새로운 기능 추가는 MetaSounds에 집중됩니다.
// DefaultEngine.ini에서 MetaSounds 플러그인 활성화 확인
[/Script/MetasoundEngine.MetaSoundSettings]
bDefaultToMetaSounds=True
// Audio Mixer가 기본 렌더러인지 확인
[Audio]
AudioDeviceModuleName=AudioMixerXAudio2 ; Windows
AudioDeviceModuleName=AudioMixerCoreAudio ; macOS
Submix 그래프 구조
오디오 라우팅과 이펙트 체인의 기본 단위
Submix는 오디오 소스들의 출력을 그룹핑하여 공통 이펙트를 적용하고 볼륨을 제어하는 단위입니다. 일반적인 DAW의 Bus/Aux Send와 유사한 개념입니다.
기본 Submix 계층
Submix 이펙트 종류
| 이펙트 | 클래스 | 용도 |
|---|---|---|
| Reverb | USubmixEffectReverbPreset |
공간감 시뮬레이션 |
| EQ | USubmixEffectSubmixEQPreset |
주파수 밸런스 조절 |
| Dynamics | USubmixEffectDynamicsProcessorPreset |
컴프레서, 리미터 |
| Filter | USubmixEffectFilterPreset |
로우패스, 하이패스 필터 |
| Delay | USubmixEffectDelayPreset |
딜레이/에코 이펙트 |
Sound Class의 Default Submix 프로퍼티를 설정하면, 해당 클래스에 속하는 모든 사운드가 자동으로 지정된 Submix로 라우팅됩니다. 이를 통해 "배경음악 Submix에 사이드체인 컴프레서를 걸어 대사 재생 시 음악 볼륨을 자동으로 낮추는" 더킹 효과를 구현할 수 있습니다.
핵심 요약
- Audio Mixer는 UE5의 기본 오디오 렌더러로, 크로스 플랫폼 소프트웨어 믹싱을 담당한다
- 오디오 파이프라인은 Game Thread → Audio Thread → Audio Render Thread의 멀티스레드 구조로 동작한다
- FAudioDevice는 오디오 시스템의 중심 클래스로, 리스너와 소스 풀을 관리한다
- UE5는 Sound Cue(레거시)와 MetaSounds(차세대) 두 가지 오디오 오브젝트 시스템을 지원한다
- 새 프로젝트에서는 MetaSounds를 권장하며, 샘플 정확도, 합성, 병렬 렌더링 등의 장점이 있다
- Submix 그래프는 오디오 라우팅과 이펙트 체인의 기본 단위로, DAW의 Bus와 유사하다
도전 과제
배운 내용을 직접 실습해보세요
프로젝트 설정 > Audio에서 Audio Device Module, Max Channels, Sample Rate 설정을 확인하세요. 콘솔에서 au.Debug.SoloAudio 명령어를 실행하고, FAudioDevice::GetNumActiveSources()를 로그로 출력하여 현재 활성 오디오 소스 수를 확인하세요.
stat Audio 명령어를 활성화하여 Audio Thread와 Audio Render Thread의 동작을 관찰하세요. 여러 사운드를 동시 재생하면서 Active Sources, Max Sources, Audio Memory 수치 변화를 기록하세요.
GetWorld()->GetAudioDevice()를 통해 FAudioDevice의 상태를 실시간으로 화면에 표시하는 디버그 HUD를 구현하세요. 활성 소스 수, Submix 구성, 리스너 위치 정보를 포함하세요.