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_mode

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