A player fires a shotgun. The sound arrives, and a fraction of a moment later the controller shakes. If that fraction is small enough, the player experiences one event. If it is large enough, they experience two events that happen to occur at the same time, which is a different and worse thing. The gap between those two experiences is measured in milliseconds, and it is the single most important number in haptic design.
Haptic feedback and sound are both short, both transient, and both triggered by the same game event. That makes them natural partners, but it also makes the timing between them critical in a way that most other audio design does not require. A footstep sound that plays 50 milliseconds late feels slightly disconnected. A haptic pulse that plays 50 milliseconds late relative to its sound feels like a bug.
This article covers the perception thresholds that determine what "synchronized" actually means, the platform APIs that handle the timing on each target, and the design principles that make the combination feel like a single event rather than two events that happen to coincide. The sound design side of these effects is covered throughout the site, from How to Make Game Sound Effects to the weapon sound layering guide.
How Close Is Close Enough: The Perception Threshold
The human perceptual system does not require perfect simultaneity for two events to feel like one. There is a window of tolerance, and the size of that window depends on which sense arrives first.
Research on audio-tactile asynchrony has produced consistent numbers across several studies. When audio leads haptics, the asynchrony becomes detectable at a lower threshold, meaning the perceptual system is more sensitive to this ordering. When haptics lead audio, the tolerance window is wider[reference:0].
The practical ranges that have emerged:
- Audio leading haptics: Asynchrony becomes noticeable outside the range of roughly -75 milliseconds to +110 milliseconds[reference:1]. A haptic pulse that arrives more than about 75 milliseconds after its sound will be perceived as a separate event.
- Haptics leading audio: The tolerance is wider, with delays up to around 109 milliseconds still reading as synchronous in some conditions[reference:2]. This means the haptic can fire slightly early without the player noticing, which is useful because the mechanical response of a vibration motor is often slightly slower than the electrical response of an audio driver.
- Typical target for game feel: A well-tuned effect keeps the haptic-to-audio offset within ±20 milliseconds, and the upper bound that most designers treat as acceptable is around 50 milliseconds. Beyond that, the effect starts to feel like two events.
These numbers matter because they determine what kind of synchronization a platform can achieve and what kind of workaround is needed when it cannot. A platform with 30 milliseconds of audio latency and 5 milliseconds of haptic latency has a 25-millisecond offset that the player will notice if it is not compensated.
The Latency Problem: Why Haptics and Audio Do Not Arrive Together
Audio and haptic output go through different hardware paths, and those paths have different latencies. The differences are small in absolute terms but large relative to the perception threshold.
Audio latency on a typical mobile device is usually in the range of 20 to 100 milliseconds, depending on the platform, the audio session configuration, and whether the audio is being processed through a software mixer. On Android, the Oboe library was developed specifically to reduce this latency, and it works with AAudio on modern SDK levels to bring it closer to the hardware minimum[reference:3].
Haptic latency varies by actuator type. A linear resonant actuator (LRA) takes time to spin up, often 10 to 30 milliseconds, and an eccentric rotating mass (ERM) motor takes even longer. The electrical signal reaches the actuator before the mechanical vibration is perceptible.
The result is that the haptic signal usually needs to be sent earlier than the audio signal, not later. The haptic motor's physical response time is the delay that the system has to compensate for. This is why the wider tolerance for haptics leading audio is useful: the mechanical reality of the actuator means the haptic command often has to be issued first.
The compensation is handled differently on each platform, and the implementation details matter.
iOS: Core Haptics and the AHAP Format
Apple's Core Haptics framework was introduced in iOS 13 and is available on iPhone 8 and later. It is described by Apple as an "event-based audio and haptic rendering API," which is a precise description: the framework treats audio and haptics as a single synchronized experience rather than two separate outputs that need to be aligned[reference:4].
The mechanism is the Apple Haptic Audio Pattern file format, or AHAP. An AHAP file is a JSON document that describes a complete haptic-audio pattern, including the timing of each haptic event and each audio event. The framework renders the pattern with the haptic and audio events synchronized internally, so the developer does not need to calculate offsets manually[reference:5].
The two event types in Core Haptics are transient and continuous. A transient is a short pulse, suitable for impacts, clicks and discrete events. A continuous event is a sustained vibration with adjustable intensity over time, suitable for engines, rumbles and held states. Both types have an intensity parameter and a sharpness parameter, which control the strength and the crispness of the sensation[reference:6].
The timing model is what makes Core Haptics useful for game
synchronization. Each event in an AHAP pattern has a
Time field that specifies when it occurs
relative to the start of the pattern. Because the audio
and haptic events share the same timeline, they are
synchronized by construction rather than by the developer
trying to match two separate clocks.
For a Unity project targeting iOS, Apple provides a CoreHaptics plugin that wraps the native framework in a C# interface. The Ricochet demo in the Apple Unity plugins repository shows the pattern: a collision sound is paired with a haptic transient in an AHAP file, and the two play together as a single event[reference:7].
The limitation of Core Haptics is that it requires authoring the pattern in advance. Deriving haptics from arbitrary audio in real time is not something the API does automatically. If the game generates its sounds procedurally, or if the sounds change at runtime, the haptic pattern has to be generated or updated accordingly.
Android: HapticGenerator and the Audio-Coupled Pipeline
Android's approach is different. Starting with Android 12, the platform includes a HapticGenerator that operates at the hardware abstraction layer. It analyzes the audio stream and derives vibration patterns from it automatically, without requiring the developer to author haptic events[reference:8].
The architecture is important for understanding the timing. The incoming audio stream passes through an AudioMixer that separates the audio data from the haptic data. The HapticGenerator processes the audio data and produces haptic data, and both are then sent to the Audio HAL for output. Because the derivation happens in the same pipeline as the audio, the timing relationship is preserved[reference:9].
The practical implication is that Android can produce synchronized haptics from any audio source without explicit haptic authoring. This is the most capable automatic audio-to-haptic system on any platform, but it is also the least controllable. The developer cannot adjust the haptic pattern beyond enabling or disabling the feature.
For games that need more control, the Android Vibrator API
allows direct haptic playback with explicit timing. The
VibratorManager and VibrationEffect
classes provide waveform control, amplitude control, and
the ability to specify the exact start time of a
vibration. The developer is responsible for aligning the
haptic timing with the audio timing, which means the
latency compensation problem is back in the developer's
hands.
A common pattern for Android games is to use the HapticGenerator for ambient or incidental haptics and the Vibrator API for critical events that need precise timing. The HapticGenerator handles the general case; the Vibrator API handles the moments where the player will notice if the haptic is late.
Web: Vibration API and Gamepad Haptics
The web platform has two haptic APIs, and they serve different purposes.
The Vibration API is available on mobile
browsers through navigator.vibrate(). It
accepts an array of millisecond durations that alternate
between vibration and pause. [200, 100, 200]
means "vibrate for 200 milliseconds, pause for 100, vibrate
for 200." The API has no amplitude control and no
automatic analysis of audio. The developer writes the
pattern array manually and triggers it at the right
moment[reference:10].
The synchronization problem on the web is that the
vibrate() call is not tied to the audio
timeline. It fires when the JavaScript executes it, which
is subject to the main thread's timing. For a game where
the haptic needs to align with a sound, the developer has
to schedule the vibrate() call relative to
the audio playback, and the main thread jitter can
introduce errors.
The workaround is to pre-compute the haptic pattern relative
to the audio, then use the audio element's
currentTime property to determine when to fire
the vibration. This is the same approach used for
scheduling audio on the Web Audio API clock: use the media
clock as the reference, not the main thread.
The Gamepad Haptic Actuator API is a
different path. It is available through the Gamepad API and
provides playEffect() for "dual-rumble" and
"trigger-rumble" effects. The dual-rumble effect has
independent control of the left and right motors, with
parameters for duration, weak magnitude, and strong
magnitude. This is the web equivalent of the console
controller rumble API[reference:11].
The Gamepad API does not provide the same level of timing control as the native console APIs. The effect is triggered by a JavaScript call, and the timing depends on the browser and the controller's firmware. For a web game, the practical target is to trigger the haptic effect in the same frame as the sound, and to accept whatever latency the platform introduces.
Unreal Engine: SoundWave-Driven Haptics
Unreal Engine provides a direct path from a sound asset to a
haptic effect through the
UHapticFeedbackEffect_SoundWave class. This
class takes a USoundWave asset and converts it
into a haptic pattern at runtime[reference:12].
The conversion works by downsampling the sound wave into a series of bytes that describe the amplitude envelope. Each byte is a value between 0 and 255, and each byte is multiplied by a scale factor that determines the haptic intensity. The resulting byte stream is sent to the haptic hardware, which plays it back as a vibration pattern [reference:13].
The practical effect is that any sound asset can be used as a haptic source. A low-frequency rumble in the sound produces a sustained vibration; a sharp transient produces a short pulse. The developer does not need to author a separate haptic pattern; the sound itself is the pattern.
The limitation is that the conversion is based on amplitude, not on frequency content. A high-frequency sound with a large amplitude produces the same haptic pattern as a low-frequency sound with the same amplitude, even though the two sound different. For effects where the haptic character should match the sound's frequency content, this is a mismatch.
For VR controllers on Oculus hardware, Unreal provides
PlayHapticSoundWave, which takes a mono sound
wave and sends the downsampled data to the controller's
haptic actuator. The bUseStereo flag, when
enabled, applies the left and right stereo channels to the
left and right controllers respectively, which allows
spatial haptic effects[reference:14].
The broader approach to procedural audio in Unreal is covered in How to Create Procedural Sound Effects in Unreal Engine MetaSounds. MetaSounds can generate the sound, and the haptic feedback system can derive the vibration from the generated output.
The Design Principles Behind Good Audio-Haptic Pairing
Apple's audio-haptic design guidance, presented at WWDC 2019, distills the practice into three principles that apply regardless of platform: causality, harmony, and utility[reference:15].
Causality means that the feedback should make it clear what caused it. A footstep sound and a footstep haptic that both occur at the moment of foot contact have a clear causal relationship. A haptic pulse that fires at a moment when nothing visible is happening has no causality, and the player will be confused about what it means.
The practical test is to ask whether the player can identify the event that produced the feedback. If the sound and the haptic both point to the same visible action, causality is satisfied. If they point to different things, or to nothing, the feedback is broken.
Harmony means that the sound and the haptic should feel like they belong together. A soft, rounded sound paired with a harsh, sharp vibration creates a mismatch. A heavy, low-frequency impact sound paired with a light, high-frequency haptic pulse creates a different kind of mismatch. The two should reinforce the same physical metaphor.
In practice, this means matching the haptic intensity to the sound's loudness, the haptic sharpness to the sound's brightness, and the haptic duration to the sound's decay. A gunshot is loud, bright and short; the haptic should be strong, crisp and brief. A door creak is quiet, dark and long; the haptic should be subtle, soft and sustained.
Utility means that the haptic should add information rather than repeat it. A haptic that fires every time any sound plays is noise. A haptic that fires only for the events that benefit from tactile confirmation is signal.
The events that benefit most from haptics are the ones where the tactile channel carries information the audio and visual channels do not. A hit that the player needs to feel to judge the timing. A weapon that has a distinct recoil for each firing mode. A low-ammo warning that the player should register without looking at the HUD.
Microsoft's Xbox accessibility guidelines take this further, requiring that haptics never be the sole channel for critical game information. A player who disables vibration must still be able to play the game, which means the haptic is a supplement to the visual and audio feedback, not a replacement for either[reference:16].
Practical Implementation: Compensating for Latency
The most common technical challenge in audio-haptic synchronization is that the two outputs have different latencies, and the developer has to compensate for the difference.
The standard approach is a look-ahead haptic system. The audio waveform is analyzed in advance, and the haptic pattern is generated and scheduled to fire before the corresponding audio event. The haptic signal is encoded or scheduled ahead of the audio, so that by the time the audio reaches the player's ears, the haptic has already been triggered and the mechanical actuator has caught up[reference:17].
The amount of look-ahead depends on the actuator and the audio pipeline. A typical LRA takes 10 to 20 milliseconds to reach full amplitude, and the audio pipeline adds another 20 to 50 milliseconds on top of that. A look-ahead of 30 to 60 milliseconds is a reasonable starting point for a mobile device, and it should be tuned on the target hardware.
The compensation can also be applied in the other direction. If the haptic is consistently early, a delay can be added to the haptic signal. If it is consistently late, a delay can be added to the audio signal. The signal processor in a typical audio-haptic system estimates the time delay between the two outputs and applies the correction automatically[reference:18].
For games with dynamic audio, the look-ahead approach has a limitation: the haptic pattern has to be generated from the audio before the audio is played, which means the audio has to be known in advance. Procedurally generated audio, which does not exist until the moment it is played, cannot be analyzed ahead of time.
The workaround is to use the procedural audio system to generate both the sound and a haptic trigger event at the same time. If the game generates a gunshot sound, it also generates a "gunshot" haptic event that fires at the right offset. The haptic is authored at the game logic level rather than derived from the audio at the DSP level.
The approach used in some VR projects is to drive the haptic from a submix envelope follower rather than from individual sound events. The envelope follower tracks the overall amplitude of a group of sounds, and the haptic intensity is derived from that. This decouples the haptic from individual sound events, which reduces the per-sound bookkeeping but also reduces the precision. The recommendation from practitioners is to downsample the envelope to around 40 Hz and apply a 60 to 80 millisecond hold with a small hysteresis band, so the haptic feels continuous without spamming updates[reference:19].
What to Test and What to Tune
Testing haptic synchronization is different from testing audio, because the feedback is not visible on a waveform display and not necessarily reproducible on a different device.
The first test is the subjective "one event or two events" check. Trigger the effect and ask whether the sound and the haptic feel like a single event or two events that happen to coincide. If the answer is "two," the offset is too large, and the look-ahead needs to be adjusted.
The second test is the repetition test. Trigger the effect twenty times in a row. The synchronization should feel consistent across all twenty. If some of them feel synchronized and others do not, the timing is jittering, which usually means the haptic is being scheduled on the main thread rather than on the audio thread.
The third test is the intensity match. Does the haptic feel like it belongs with the sound, or does it feel too strong or too weak? A haptic that is too strong for the sound draws attention to itself; a haptic that is too weak disappears. The match should be close enough that the player does not consciously register the haptic as a separate thing.
The fourth test is the accessibility check. Disable haptics entirely and play the game. Does it still feel complete? If the game feels broken without haptics, the haptic is carrying information that should also be present in the visual or audio channels. Haptics should supplement, not replace.
The tuning parameters that matter most are the look-ahead offset and the haptic intensity. The look-ahead should be tuned first, because a well-timed weak haptic feels better than a poorly-timed strong one. Once the timing is right, the intensity can be adjusted to match the sound.
Create Sound Effects for Haptic Pairing
Open the SfxMaker generator and create short, punchy sound effects with a strong transient. Sounds with a clear attack are the easiest to pair with haptic feedback, because the attack moment is the moment the haptic should fire.
Open SfxMaker Generator →Common Mistakes
- Triggering the haptic after the sound plays. Because audio usually has more latency than the haptic actuator, the haptic command often needs to be issued first. Firing the haptic after the sound is called produces a consistent late haptic.
- Using the same haptic for every sound. A single generic rumble that fires for every event carries no information. The haptic should match the character of the sound it is paired with.
- Making the haptic too strong. A haptic that is louder than the sound draws attention to itself and breaks the illusion. The haptic should be felt, not noticed.
- Scheduling haptics on the main thread. The main thread's timing is subject to frame rate variation and garbage collection pauses. The audio thread is the correct place to schedule haptics that need to be precisely timed.
- Ignoring the accessibility requirement. A game that cannot be played without haptics is a game that fails for players who have disabled vibration. Haptics must supplement other feedback, not replace it.
- Assuming one platform's timing works on another. The latency profile of iOS, Android and the web are different. A look-ahead value tuned for one platform can be wrong on another.
How to Decide What Deserves Haptic Feedback
Not every sound needs a haptic partner. The events that benefit most are the ones where the tactile channel adds information that the player would otherwise have to infer.
The strongest candidates for haptic pairing are:
- Impacts and collisions. The moment of contact is a physical event, and a haptic pulse that coincides with the sound makes the contact feel more real.
- Weapon fire and recoil. The tactile sensation of a weapon firing is part of what makes the weapon feel powerful. The sound and the haptic together communicate the weapon's character.
- Damage taken. A player who is being hurt should feel it. A haptic pulse on damage makes the feedback more immediate and more urgent.
- State changes that the player needs to notice. Low health, low ammo, an incoming attack. A haptic that fires at the moment of the state change draws attention to the visual and audio cues that carry the same information.
- Mechanical interactions. A lever being pulled, a switch being flipped, a door being opened. The tactile component makes the interaction feel physical.
The events that do not need haptics are the ones where the tactile channel adds nothing. Ambient sounds, music, UI navigation, and anything that plays continuously or frequently enough to become fatiguing. A haptic that fires on every menu click is a haptic that the player will disable within the first session.
The general rule is that haptics should be reserved for the events where the player's body is supposed to be involved in the game world. A gunshot, a punch, a landing, a collision. These are the moments where the tactile feedback reinforces the physical fiction. Everything else is a candidate for staying silent.