Input lag of (analog video) arcade games

This page aims to be a collection of verified input lag measurements for different arcade hardware. I have yet to see such a site with actual verifiable data proving the measurements, or even a clear definition of how they’ve been measured.

How I define “frames of input lag”

The typical definition of “input lag” is something like “time between an input is triggered and the resulting action is visible on screen”. This can easily be measured in milliseconds, but will depend heavily on at least two factors.

  1. Timing of input in comparison to when the game engine samples the port
  2. Position of player sprite on screen

If a button is pressed just before the input port is sampled, no additional latency is added, but if a button is pressed right after the input port has been sampled, there will be close to a full frame before the input is actually triggered.

Since (CRT) monitors render frames from top to bottom, the top lines of the display will be output close to a full frame before the bottom lines.

To abstract away these factors, I will use the following constant definition of “Frames of input lag". For further reading, also see the site inputlag.science, which uses a similar standard.

Input lag = Count of frames of inaction between an "input frame" and a visible "output frame"

This means that if an input is triggered during a frame, and immediately visible the frame after it, there will be an input lag of 0 frames. Click measurements below for details.

Measurements

All data is measured from original PCBs. Click one of the games to show the measurements data for it.

The image where input was triggered will be marked GREEN and the first image where sprite movement is visible will be marked RED.

Metal Slug 6 (Atomiswave): 5 frames
Armed Police Batrider: 4 frames
Dolphin Blue (Atomiswave): 4 frames
Mars Matrix (CPS2): 3 frames
Battle Garegga: 3 frames*
Tengai: 3 frames (Likely the same for other Psikyo 68k games)
Gigawing (CPS2): 3 frames
Guilty Gear X 1.5 (Atomiswave): 3 frames
Demon Front: 2 frames
1944: The Loop Master (CPS2): 2 frames
Mushihimesama: 2 frames (Likely the same for other Cave CV1000 games)
Ibara: 2 frames (Likely the same for other Cave CV1000 games)
Guwange: 2 frames (Likely the same for other Cave Gen 1 games)
DoDonPachi: 2 frames (Likely the same for other Cave Gen 1 games)
ESP Ra.De.: 2 frames (Likely the same for other Cave Gen 1 games)
Soukyugurentai: 2 frames
Sonic Wings / Aerofighters: 2 frames
Progear no Arashi (CPS2): 2 frames
Super Street Fighter II Turbo (CPS2): 2 frames
Dimahoo / Grand Mahou Daisakusen (CPS2): 2 frames
Night Raid (G-NET): 2 frames
XII Stag (G-NET): 2 frames
Shikigami no Shiro (G-NET): 2 frames
Psyvariar : Medium Unit (G-NET): 2 frames
Psyvariar : Revision (G-NET): 2 frames
Espgaluda: 1 frame (Likely the same for other Cave PGM games)
DoDonPachi DaiOuJou Tamashii (PGM2): 1 frame
Pulstar: 1 frame
Strikers 1945 II: 1 frame (Likely same for other Psikyo SH2 games)

How to measure input lag

The high-level procedure for measuring input lags is quite simple:

There are some details that need to be considered when doing this.

Detecting input

Simply checking which exact 240fps frame a button or lever is activated can be complicated. A simple solution to work around this is to wire up a LED to light up when the input is triggered, and have this be visible in the video.

Inspecting video

There is a great iPhone app called “Is it snappy” which allows quickly going through the 240fps frames, marking input and output. Alternatively you can feed the video into avidemux and step through frames manually.

Running several samples

Make sure to run several measurements, to get the input to trigger at different raster positions. This should give you a variance of approximately 16 milliseconds spread out over a rendered frame. Use this frame as FRAME_WHERE_INPUT_TRIGGERED and verify that the number of frames until FRAME_OF_VISIBLE_OUTPUT is consistent.

Circuit for hooking up LED to buttons/lever

I recommend buffering the input to the LED through an inverter such as a 7404 or similar. You can assume that the PCB input will have an onboard pullup resistor. In practice this means: