在Raspberry Pi上使用pygame进行屏幕撕裂

时间:2016-05-24 07:40:40

标签: python raspberry-pi pygame vsync

我现在被困在屏幕撕裂问题上大约一个星期了。

这是我的问题:我想制作一个能够非常快速地显示一系列PNG图像的程序(速度为30 fps或更高)。为此,我使用了pygame库,尤其是pygame.display.blitpygame.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文档中,他们建议使用屏幕init的其他标志(pygame.HWSURFACE and pygame.DOUBLEBUFhttp://www.pygame.org/docs/ref/displayy.set_mode)。显然这些可以帮助纠正屏幕撕裂问题。但是当我使用这些标志时,我看不到屏幕撕裂修正。

我已经看到某个地方pygame无法处理X11上的vsync,这可以解释为什么我认为HWSURFACE和DOUBLEBUF标志没有区别。

有没有人在Raspberry Pi上遇到过这个vsync问题?是否有一个参数放在“config.txt”文件中? 有没有人有办法获得真正的vsync信息,以避免这些屏幕撕裂效应?

我已经看到pyglet可以在创建的窗口中处理vsync,但由于未知原因,我无法在pyglet窗口中显示图像,我真的不确定它是否能解决问题,特别是如果Raspberry可以现在处理vsync。

1 个答案:

答案 0 :(得分:0)

尝试使用Pygame时钟来处理时序,它更容易实现和理解,它可以解决问题。

如下所示:

import pygame as py
py.init()

WINDOW = (400,400)
screen = py.display.set_mode(WINDOW)

nbPicturesToLoad=12
pictures = range(nbPicturesToLoad)
for i in range(nbPicturesToLoad):
    pictures[i]=py.image.load(pictureName).convert()

FPS = 30
clock = py.time.Clock() # Create a clock object

done = False
while not done:
    for event in py.event.get():
        if event.type == py.QUIT:
            done = True
    for i in range(nbPicturesToLoad):
        screen.fill((255,255,255))
        screen.blit(pictures[i],(0,0))
        py.display.flip()
        clock.tick(FPS) # use pygame.time.Clock to wait 1/30th of a second
py.quit()

然而,由于这是一个屏幕撕裂问题,解决方案可能是完全停止使用Pygame。 How to avoid tearing with pygame on Linux/X11 这个问题似乎涵盖了你可能正在寻找的东西。

祝你好运。