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

时间:2009-07-04 16:53:12

标签: graphics x11 sdl pygame vsync

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

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

然而,正在运行

SDL_VIDEODRIVER=dga ./mygame.py

使用

进行pygame初始化
pygame.error: No available video device

(尽管xdpyinfo显示存在XFree86-DGA扩展名。)

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:4)

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