Quick answer: Pygame full-screen tearing on Linux even with vsync=1? Some Wayland compositors and X11 setups ignore the SDL vsync hint — force the driver hint or use a borderless window.
Pygame on Ubuntu shows horizontal tearing during scrolling, despite passing vsync=1 to set_mode. The compositor (or lack of one) is bypassing the hint.
SDL Driver Hint
os.environ["SDL_HINT_RENDER_VSYNC"] = "1"
// before pygame.display.set_modeBelt-and-suspenders for SDL2 backends — some pick this up when the constructor flag doesn’t.
Compositor State
Wayland compositors handle vsync at the surface level. KWin and Mutter respect it by default. Tiling WMs (i3, sway) often don’t composite at all — tearing is expected unless you enable a compositor (picom, etc.).
Borderless Full-Screen
Use pygame.display.set_mode(size, pygame.NOFRAME | pygame.FULLSCREEN). The compositor treats the window as full-screen and engages tear-free path on KDE/GNOME.
Verifying
Scrolling test pattern shows no tearing. Headphones-on listening for vsync stalls: smooth at the monitor’s refresh rate.
“Linux vsync is a stack of hints — SDL, compositor, mode. All three need to cooperate.”
Test on at least one tiling WM without a compositor — that’s the worst-case Linux user, and they’ll report the tearing.