Quick answer: Pygame.display.flip() blocking long enough for input events to backlog? VSync wait can run 16ms; pump events both before and after flip to drain.

Players report input lag after fast movements. Profiler: 14ms of frame is in display.flip().

Pump events both sides

pygame.event.pump()  # pre-flip drain
pygame.display.flip()
# events queued during flip

The flip-time events get the next-frame's pump; reading them after flip is sub-frame latency.

Or disable vsync

Trade tearing for input latency. pygame.display.set_mode(size, vsync=0) + cap via Clock.tick.

Use SDL_HINT_RENDER_VSYNC

Lower-level vsync control. For specific use cases.

“Vsync is a long pause. Events arrive during the pause.”

If your input feels laggy, the vsync gap is often the cause. Measuring input-to-render latency is the first step.

Related reading