我被困在屏幕撕裂问题上大约一个星期了。
这是我的问题:我想制作一个可以非常快速地显示一系列 PNG 图片的程序(以 30 fps 或更高的速度)。为此,我使用 pygame 库,尤其pygame.display.blit
是pygame.display.flip
.
这是代码示例(带有自制延迟功能):
import time
import pygame
screen=pygame.display.set_mode(size, pygame.FULLSCREEN)
nbPicturesToLoad=12
pictures=range(nbPicturesToLoad)
for i in range(nbPicturesToLoad):
pictures[i]=pygame.image.load(pictureName).convert() //Here pictureName depends on the value of i
(...)
for i in range(nbPicturesToLoad):
timer1=time.time()
screen.blit(pictures[i], (0,0))
pygame.display.flip()
timer2=time.time()
timer=timer2-timer1
while(timer<0.03333):
timer2=time.time()
timer=timer2-timer1
计时器允许我在屏幕上拥有相同的刷新率。我的问题是人们可以亲眼看到存在屏幕撕裂问题(https://en.wikipedia.org/wiki/Screen_tearing)。在 pygame 文档中,他们建议对屏幕初始化使用其他标志(pygame.HWSURFACE and pygame.DOUBLEBUF
,http://www.pygame.org/docs/ref/display,y.set_mode
)。显然,这些可以帮助纠正屏幕撕裂问题。但是当我使用这些标志时,我看不到屏幕撕裂校正。
我在某处看到 pygame 无法在 X11 上处理 vsync,这可以解释为什么我认为 HWSURFACE 和 DOUBLEBUF 标志没有区别。
有人在 Raspberry Pi 上遇到过这个 vsync 问题吗?是否有要放入“config.txt”文件的参数?有没有人有办法获得真正的 vsync 信息来避免这些屏幕撕裂效果?
我已经看到 pyglet 可以在创建的窗口中处理 vsync,但由于未知原因,我无法在 pyglet 窗口中显示图像,而且我真的不确定它是否能解决问题,特别是如果 Raspberry 无法处理现在vsync。