Input Latency

Latency is the worst, whether you feel it or not. It inserts itself between you and the game. The best-case scenario is that you don't notice, and the worst-case scenarios are floaty, unresponsive, or inconsistent controls. The goal of this project is to measure as many controllers as possible on MiSTer FPGA, using 1kHz polling rate for maximum fidelity. These results may or may not directly apply to other systems with higher polling rates, but faster is always better, whether you "feel" it or not.

Background

Over the past 4 years, I've become obsessed with measuring USB input latency. With the help of developers on the Discord, Kitrinx created a modified MiSTer NES core, _Jorge created Arduino microcontroller code to measure the end to end latency of USB devices, and Lemonici improved the Arduino code and created the R code to summarize the data. The result is more than 250 measurements the provide an objective way to compare controller responsiveness. Several of the measurements are user submitted. A huge thanks to all contributors!

How it Works

  • The ATMega 32u4 microcontroller is soldered to a button on the controller PCB
  • The controller PCB is connected to MiSTer (wired USB, or wireless).
  • The microcontroller commands button presses (at random intervals) by connecting the button to ground, then releasing.
  • A custom version of the NES core outputs a high signal on one of MiSTer's User IO pins when a USB button press is detected.
  • The microcontroller measures the time from button press command to high signal on the MiSTer user IO pin.
  • A CSV file is generated with the result number, and the corresponding latency
  • An RStudio script analyzes each CSV files and generates a histogram PNG with statistics of the results.

MiSTer was chosen as the test platform of choice due to its zero-latency FPGA GPIO, and low-latency USB stack. At the time, no one knew how minimal the USB latency was. In recent times, MiSTer's USB latency has been observed to add 0.2ms to controller results. When configured to 1ms USB polling interval (1kHz polling rate), the theoretical minimum average latency is 0.5ms. The lowest measured average latency is 0.7ms, hence 0.2ms of latency added by MiSTer. It's hard to underscore how little latency 0.2ms is. That 0.002 seconds, or 200 microseconds. It's hard to compare something that's 1/1000th of a blink of an eye.

Latency, in Context

Latency is bad, but it's certainly not the only factor when choosing a controller. Other important factors include d-pad feel and accuracy, analog joystick range, dead-zone and drift, ergonomics (which will vary from person to person), controller style (number of face buttons, joysticks, etc.), and more. You don't need to hear it from me, but please view these results in the context of the totality of a controller, not the only determining factor.

I created tiers for the resulting latency to help delineate where I think latency matters. Keep in mind these are my personal feelings and lower is always better.

  • Diamond (<1ms)
  • Platinum (1-5ms)
  • Gold (5-10ms)
  • Silver (10-15ms)
  • Bronze (15-20ms)
  • Rust (>20ms)

Results

Latency Exploration Page

You can browse and filter results easily on the Latency Exploration Page. This is my preferred way to view results, as it allows for refinement of controller type, number of face buttons, latency tier, etc.

Latency Spreadsheet

For the nitty gritty, detailed results, check out the Latency Spreadsheet.