8

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

我正在使用默认的 SDL X11 驱动程序。谷歌搜索表明 X11 不提供垂直同步功能(即使使用FULLSCREEN|DOUBLEBUF|HWSURFACE标志创建的显示)是 SDL 的一个已知问题,我应该改用“dga”驱动程序。

然而,运行

SDL_VIDEODRIVER=dga ./mygame.py

引发 pygame 初始化

pygame.error: No available video device

(尽管xdpyinfo显示了 XFree86-DGA 扩展)。

那么:获得无撕裂垂直同步翻转的诀窍是什么?通过让这个 dga 工作或其他机制工作?

4

3 回答 3

5

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

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

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

于 2009-08-11T10:08:26.160 回答
4

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

于 2009-10-08T22:40:10.383 回答
0

使用该SCALED标志并vsync=True在调用时set_mode您应该全部设置好(至少在任何实际支持此功能的系统上;在某些情况下,SDL 仍然无法为您提供支持 VSync 的表面,但它们越来越少见)。

于 2022-02-06T07:52:15.847 回答