Audio Performance
Audio is its own thread that no one looks at until it breaks. UE5's MaxChannels caps at 64 internally; MetaSound Pages let you swap in lighter graphs per platform; concurrency rules are the difference between 30 active sounds and 300 active sounds. This tutorial covers the audio threading model, MetaSound vs legacy SoundCue, virtualization modes, and the Wwise integration cost when you go hybrid.
Audio threading model
UE5 has three audio threads:
- Game thread — spawns ActiveSounds, fires notifies.
- Audio thread — bookkeeping; ActiveSound update loop.
- Audio render thread — DSP, mixing, output.
The audio thread is not the audio render thread — community confusion is constant; Epic staff repeatedly clarify on the forums. Blocking in a sound notify hits the game thread (because notifies fire there); blocking in DSP hits the render thread.
AudioMixer architecture & MaxChannels ceiling
MaxChannels on most platforms defaults to 32, capped 1–64 internally (FAudioPlatformSettings). MaxChannels cannot exceed MaxSources — engine logs "Can't increase MaxChannels past MaxSources" if violated.
Devs trying to bump max voices to 64 in UE5 hit this and get a non-obvious clamp warning. Audit Project Settings → Audio → Max Channels per platform.
MetaSounds vs legacy SoundCue
MetaSounds are sample-accurate DSP graphs — the modern path. SoundCue is the UE4 legacy. New projects: MetaSound; legacy projects: gradual migration.
MetaSound Pages (5.6+) let you ship a single MetaSound asset with multiple pages — quality-tiered graph variants — switched at runtime via au.MetaSound.Pages.SetTarget or per-platform device profile. The same MetaSound can ship a high-quality version for desktop and a stripped-down version for Switch without two assets.
Constructor pins in MetaSound graphs are read-only at runtime but cheaper than dynamic inputs — move inputs that don't need to vary onto constructor pins as a documented MetaSound optimization.
UE 5.7 added MetaSound Operator Cache memory reductions and Vorbis decode-only build option for memory-constrained targets.
Sound Concurrency — voice limiting
Sound Concurrency is the asset that decides "how many of THIS sound type can play simultaneously." Settings:
- Max Voice Count — hard cap.
- Resolution Rule — what happens when a new sound exceeds the limit: StopOldest, StopFarthest, StopFarthestThenOldest, PreventNew.
- Generation Volume Scaling — older sounds quieter to make new ones audible.
- Voice Stealing Fade — gentle stop instead of hard cut.
A common shipping bug: a designer removes a Sound Concurrency asset, and active voice count climbs from 38 to 61 silently. Invisible in stat unit, obvious in audio-thread profiling.
Virtualization modes
When a sound goes inaudible (out of range, too quiet to hear), it can either be killed or virtualized — tracked in time without rendering audio:
- PlayWhenSilent — the sound continues in time even when silent. Useful for music sync, looping ambience. CPU cost continues.
- Seek Restart (5.7+) — new mode that restarts the sound at the right point when it becomes audible again, without paying CPU during silence.
The trap: PlayWhenSilent on a long looping MetaSound is a steady CPU cost that doesn't show up in any HUD. Audit which sounds need PlayWhenSilent and which can use Seek Restart.
Attenuation & reverb
Attenuation falloff curves, occlusion traces, reverb send methods — all per-voice CPU you can't see in stat unit. au.SoundDistanceOptimizationLength sets the max duration a one-shot must be in order to be a candidate for distance-based culling. Short stingers may bypass culling and pile up.
Convolution reverb — block size is the actual cost lever; defaults are not free, IR length is hidden CPU. Higher block size = lower CPU + higher latency; lower block size = opposite. Hardware acceleration is optional per platform.
Source vs submix effects
Source effects run per-voice. CPU multiplies by active voice count. Apply only when a single voice needs unique processing (per-character voice modulation).
Submix effects run on a shared mixed bus. Pay once for any number of voices feeding the submix. Apply for global effects (master EQ, master reverb, mastering compressor).
The trap: replicating a submix effect chain as source effects on every voice. Multiplies the CPU cost by the voice count. Audit on a per-voice basis whether the effect is genuinely source-specific.
Wwise integration cost
If you ship Wwise, the cost shape changes. Audiokinetic's blog explicitly calls out:
- AkComponent per-frame work — every registered AkComponent does work each frame. Spawning a new one per event instead of reusing existing components is the most common Wwise+UE perf bug.
- SoundBank streaming — oversized banks blow load times. Audiokinetic recommends category-based banks loaded on demand.
- Wwise 2025.1 Command Buffer API reduces per-frame integration overhead.
- The Wwise integration was rewritten in 2022.1 — older tutorials (4.27 era) describe a different code path.
Profiling & common killers
Tools:
stat audio— audio thread + mixer summary.stat soundwaves/stat soundcues/stat soundmixes/stat soundsources— per-asset-type counters.au.Debug.Sounds 1/au.Debug.SoundCues 1— per-frame text overlays.au.3dVisualize.Enabled 1— in-world audio gizmos.- Insights audio trace + 5.6 MetaSound asset scopes for build/render memory.
au.Debug.Sounds instead.
Common audio perf killers:
- Designer removes Sound Concurrency asset; voice count silently climbs.
PlayWhenSilenton a long looping MetaSound — steady invisible CPU.- Source effects replicating what should be a submix chain.
- Convolution reverb with too-short block size + long IR.
- AkComponent spawn-per-event instead of reuse.
- 4K UI textures... wait, that's a different tutorial.
PerfGuard can baseline active voice count + audio thread time per scenario, gate CI on regressions like "active voices climbed from 38 to 61" or "audio render thread went from 1.4 ms to 3.2 ms after a feature merge." Surface MetaSound Operator Cache memory deltas via 5.6+ Insights asset scopes.
- Memory & VRAM Optimization — audio memory budgeting.
- Performance Gotchas — cross-cutting issues.