如何避免在Linux/X11上使用pygame进行撕裂

tim*_*day 6 x11 graphics pygame sdl vsync

我一直在玩pygame(在Debian/Lenny上).它似乎工作得很好,除了烦人的blits撕裂(全屏或窗口模式).

我正在使用默认的SDL X11驱动程序.谷歌搜索表明SDL的一个已知问题是X11没有提供vsync功能(即使使用FULLSCREEN|DOUBLEBUF|HWSURFACE标志创建的显示),我应该使用"dga"驱动程序.

但是,跑步

SDL_VIDEODRIVER=dga ./mygame.py
Run Code Online (Sandbox Code Playgroud)

抛出pygame初始化

pygame.error: No available video device
Run Code Online (Sandbox Code Playgroud)

(尽管xdpyinfo存在XFree86-DGA扩展).

所以:获得无泪vsynced翻转的诀窍是什么?通过让这个dga工作或其他机制?

Zoo*_*tor 5

将撕裂降至最低的最佳方法是使帧速率尽可能接近屏幕频率。除非您通过它运行 OpenGL,否则 SDL 库没有 vsync,因此唯一的方法是自己估算帧速率。SDL 硬件双缓冲区不能保证,虽然它在工作时很好。我很少看到它在行动。

根据我使用 SDL 的经验,您必须使用 OpenGL 来完全消除撕裂。这是一个调整,但绘制简单的 2D 纹理并不是那么复杂,您还可以获得一些其他额外的好处,您可以实现这些好处,例如旋转、缩放、混合等。

但是,如果您仍然想使用软件渲染,我建议使用脏矩形更新。习惯它也有点困难,但它节省了大量的处理工作,这可能会使更新更容易跟上节奏,并避免整个屏幕被撕裂(除非你滚动整个游戏区域或其他东西)。以及绘制到缓冲区所需的时间最少,这可以避免在屏幕更新时发生位块传输,这是撕裂的原因。


tim*_*day 5

好吧,我最终的解决方案是切换到Pyglet,它似乎比Pygame更好地支持OpenGL,并且没有任何闪烁问题。