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

Graphics 如何在Linux/X11上使用pygame避免撕裂,graphics,x11,sdl,pygame,vsync,Graphics,X11,Sdl,Pygame,Vsync,我一直在玩pygame(关于Debian/Lenny)。 它似乎工作得很好,除了恼人的blits撕裂(全屏或窗口模式) 我使用的是默认的SDLX11驱动程序。谷歌搜索表明,SDL的一个已知问题是X11没有提供vsync功能(即使是使用全屏| DOUBLEBUF | HWSURFACE标志创建的显示器),我应该使用“dga”驱动程序 然而,运行 SDL_VIDEODRIVER=dga ./mygame.py 将pygame初始化与 pygame.error: No available video

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

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

然而,运行

SDL_VIDEODRIVER=dga ./mygame.py
将pygame初始化与

pygame.error: No available video device
(尽管
xdpyinfo
显示存在XFree86 DGA扩展)


那么:获得无泪vsynced翻转的诀窍是什么?无论是通过使dga工作还是其他机制?

将撕裂保持在最小的最佳方法是使帧速率尽可能接近屏幕频率。SDL库没有vsync,除非您通过它运行OpenGL,所以唯一的方法是自己近似帧速率。 SDL硬件双缓冲区不能保证,尽管它工作时很好。我很少看到它在起作用

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


但是,如果您仍然希望使用软件渲染,我建议使用脏矩形更新。这也有点难以适应,但它节省了大量的处理,这可能使更新更容易跟上进度,并避免整个屏幕被撕裂(除非您滚动整个播放区域或其他内容)。此外,绘制缓冲区所需的时间最少,这可以避免在屏幕更新时发生闪烁,这是撕裂的原因。

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

您的显卡是否有合适的内核驱动程序。对于X11,您需要一个内核驱动程序和一个X11库来访问它。如果缺少一个,另一个可以工作,但无法使用。我对此有点惊讶,因为在X11中似乎提供了DGA功能,但没有提到任何关于内核模块的内容(在lsmod中会显示什么?)。值得一提的是,我将nv xorg驱动程序与旧的5系列AGP NVidia卡一起使用。Pyglet在API和实践方面也与其他语言和现代技术的其他图形库更加接近。如果你不想一路走下去,这是另一个选择。它将OpenGL封装在简单的类和方法中,并在Pygame中运行良好。