-
Notifications
You must be signed in to change notification settings - Fork 8
WorldAudio Limits Reference
Technical reference for WorldAudio system limits and platform constraints.
VRChat has platform-imposed limits on active audio sources:
| Limit | Count |
|---|---|
| Active (playing) AudioSources | ~32 |
| Virtual (pausable) AudioSources | ~64 |
| Neither playing nor virtual | No automatic recovery |
The WorldAudio system manages these limits via MaxActiveSources. When the limit is reached, lower-importance AudioSources are suspended.
- Importance recalculation happens every frame for a subset of emitters
- More emitters = more CPU per frame
- Occlusion requires raycasting — more raycasts = more CPU
- Use
PartitionStateto configure emitter partitioning. Tune update frequency withUpdatesPerFrameandImportanceUpdatesPerFrameon WorldAudioController
WorldAudio only works with Unity-based video players (e.g., Unity VideoPlayer, VRC Unity Video Player). It does not work with AVPro Video Player or other third-party video players.
Why: WorldAudio manages AudioSource components directly. AVPro bypasses Unity's audio pipeline and outputs audio through its own system, making it invisible to WorldAudio.
Workaround: Use Unity-based video players. For AVPro, use a separate audio source component on the same GameObject and configure it manually.
The WorldAudio system assumes exactly one AudioListener in the scene. Multiple listeners are not supported.
Why: Importance calculations and occlusion raycasts are relative to a single listener position. Multiple listeners would require duplicating these calculations.
Workaround: Use a single camera with an AudioListener. Do not add AudioListener to other cameras.
Once an AudioSource is registered with WorldAudio, you cannot control it directly from your code. WorldAudio manages play/pause/culling state based on importance and privacy.
Why: WorldAudio calculates importance scores and decides which AudioSources should be active. Directly setting AudioSource.Play() or AudioSource.Stop() conflicts with WorldAudio's management.
Workaround: Use AudioSourceStateController (on the same GameObject) to control play/pause/stop. For manual control, do not register the AudioSource with WorldAudio.
- WorldAudio Limitations — explanation of why these limits exist
- WorldAudio-Subsystem — full system details
- WorldAudioController — controller settings
- Architecture
- Occlusion
- Voice Directionality
- Height Scaling
- Audio Processing Pipeline
- Private Voice Channels
- WorldAudio Subsystem
- WorldAudio Limitations
- Set Up Occlusion
- Set Up Voice Channels
- Set Up Reverb
- Set Up Height Scaling
- Set Up Voice Directionality
- Set Up Microphone
- Set Up WorldAudio Emitters
- Enable Debug Mode
- Tutorial #1: Custom Voice Override Zone
- Tutorial #2: Private Voice Channels
- Tutorial #3: Setting Up World Audio
- PlayerAudioController
- PlayerAudioOverride
- PlayerAudioOverrideList
- PlayerAudioView
- PlayerAudioConfigurationModel
- SyncedPlayerAudioConfigurationModel
- VoiceUtils
- IgnoredPlayers
- AudioObstacle
- DefaultPlayerOcclusion
- NullPlayerOcclusion
- PlayerOcclusionStrategy
- Privacy Channel Reference
- AdjustableGain
- DynamicPrivacy
- PickupMicrophone — MVC microphone system with MicModel/MicController/MicView
- VoiceOverrideTriggerZone
- VoiceOverrideRoom