当前位置: 首页 > 知识库问答 >
问题:

在树莓皮上使用pygame进行屏幕撕裂

匡凌
2023-03-14

我被屏幕撕裂问题困扰了大约一周。

这里是我的问题:我想做一个程序,可以显示一个PNG图片序列非常快(以30帧或以上的速度)。为此,我使用pygame库,尤其是pygame。陈列blitpygame。陈列翻转

下面是一个代码示例(带有自制的延迟功能):

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)。在pyplay留档他们建议使用其他标志的屏幕init(pyplay.HWSURFACE和pyplay。DOUBLEBUF,http://www.pygame.org/docs/ref/display,y.set_mode)。显然,这些可以帮助纠正屏幕撕裂的问题。但是当我使用这些标志时,我看不到屏幕撕裂校正。

我在某个地方看到pyplay不能处理X11上的vsync,这可以解释为什么我认为HWSURFACE和DOUBLEBUF标志没有区别。

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

我已经看到pyglet可以在创建的窗口中处理vsync,但是由于未知的原因,我不能在pyglet窗口中显示图像,我真的不确定它是否能解决这个问题,尤其是如果覆盆子现在不能处理vsync。

共有1个答案

隆睿
2023-03-14

尝试使用Pyplay时钟来处理计时,它更容易实现和理解,它可能会解决这个问题。

如下所示:

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。如何避免在Linux/X11上使用pygame撕裂这个问题似乎涵盖了您可能需要的内容。

祝你好运

 类似资料:
  • 我试图移动这个图像: 在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样: 我使用的代码是类似于此的循环: 到目前为止,我已经尝试了以下方法来解决这个问题: 在创建屏幕时使用,,标志,这没有效果,我也调整了更新为(因为使用?)时建议使用此选项) 在GPU和CPU之间拆分内存(我在raspberry pi 2上运行此功能)我尝试过为这两个处理器提

  • 您好,我正在中制作一个游戏,我想知道如何以及最好的方式是在屏幕上添加游戏。以下是玩家健康状况小于或等于0的代码: 我不确定该怎么做,因为我试图使用另一个py呼叫游戏,但玩家死亡的时间被重置为0并返回,所以玩家死亡的地方可能发生任何事情吗?

  • 我试图检测从覆盆子pi图像中拍摄的两张照片之间的运动。我通过比较原始像素数据来做到这一点。下面是一个简单的脚本,我用它来测试比较。 在脚本中,我启动相机,拍摄第一张照片,等待几秒钟,拍摄第二张照片并计算差值。但是每次我运行这个脚本时,“val1”变量总是0.0。任何帮助都将不胜感激。

  • 我制作了一个类,在draw函数中,我画了一个文本区域,一些静态文本,并给屏幕上色。draw函数位于while循环中。我希望整个pygame屏幕除输入框外都清晰,并且我希望屏幕改变颜色。我该怎么做?我的代码如下: ######################################################################################### 皮加梅。

  • 我在VPS的Xvfb上运行火狐。我想做的是对页面进行全页截图。 我可以使用以下方法将Firefox重定向到特定页面 并使用ImageMagick进行屏幕截图(在X内部) 问题是,大部分页面需要滚动,我无法事先知道高度。 另一种方法是挑一个非常大的高度(像4000px)然后对图像进行处理,去掉无用的部分。但那是不必要的处理。 我发现了许多Firefox插件,但我正在寻找一个可以使用Shell命令行编

  • 我一直在尝试使用pygame来显示游戏场景,但它似乎已经停止了对我的工作:在pygame关闭之前,它只在我创建的任何屏幕上显示一个灰色框,然后屏幕上应该显示的内容在退出之前短暂闪烁。例如,下面的最小代码显示灰色屏幕5秒钟,然后快速闪烁黑色并退出: 这似乎是屏幕显示的问题,而不是pygame本身的问题,因为我可以使用pg.image制作曲面并将其保存到图像文件中。save(),它们在那里看起来很好。