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 flipThe 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.