Python Pygame在屏幕上移动线时会撕裂屏幕

Python Pygame在屏幕上移动线时会撕裂屏幕,python,pygame,raspberry-pi,vsync,Python,Pygame,Raspberry Pi,Vsync,我正在尝试移动此图像: 在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样: 我使用的代码是一个类似以下内容的循环: screen.blit(img, (x,y)) pygame.update((x,y),(w,h)) pygame.draw.rect(screen,(0,0,0),((x,y),(w,h))) 到目前为止,我已尝试以下方法来解决此问题: screen.blit(img, (x,y)) pygame.update((x,

我正在尝试移动此图像:

在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样:

我使用的代码是一个类似以下内容的循环:

screen.blit(img, (x,y))
pygame.update((x,y),(w,h))
pygame.draw.rect(screen,(0,0,0),((x,y),(w,h)))
到目前为止,我已尝试以下方法来解决此问题:

screen.blit(img, (x,y))
pygame.update((x,y),(w,h))
pygame.draw.rect(screen,(0,0,0),((x,y),(w,h)))
在创建屏幕时使用
HWSURFACE
FULLSCREEN
DOUBLEBUF
标志,这没有任何效果,我还将我的
.update(rect)
调整为
.flip()
(因为使用
DOUBLEBUF
时建议这样做)

在GPU和CPU之间拆分内存(我在raspberry pi 2上运行此功能)我尝试过为这两个处理器提供更多内存,没有任何更改

设置clock.tick将更新速率限制为60 FPS(也高于或低于60 FPS),这确实消除了一些撕裂,但不是全部撕裂

向左或向右调整每个增量的大小,使增量越小,撕裂越少,但速度也越慢。(不能开得太慢)

我在某处读到,
HWSURFACE
比drawing更好地支持
blit
,而不是在之前的位置上绘制一个黑色矩形(移动图像以确保图像后面没有痕迹),尽管我无法确认这一点这没有效果

如果有任何其他解决方案可以改善这种情况,我将不胜感激。

我不想从PyGame改成其他任何东西(比如pyglet),因为到目前为止我已经用PyGame做了很多实现,但我愿意接受建议

干杯

编辑

要求的相关代码:

if scanner == True:
    clocker.tick(clockspeed)
    if x < 11:
        slower = 3
        if firstTime == True:
            img.set_alpha(int(x * 25))
            newSurf.set_alpha(int(x * 25))
            screen.blit(newSurf,(xText,35))
            pygame.display.update((xText,35),((xText + newSurf.get_width()),(50 + newSurf.get_height())))
            img.set_alpha(255)

    elif x > (divider - 15):
        slower = 3
    else:
        slower = 0
        firstTime = False

    screen.blit(img, ((xStart - (x * increment) + slower),100))
    pygame.display.update(((xStart - (x * increment) + slower),100),(95,450))
    pygame.draw.rect(screen, (0,0,0), (((xStart - (x * increment) + slower),100),(95,450)))
如果scanner==True:
时钟。滴答声(时钟速度)
如果x<11:
较慢=3
如果firstTime==True:
图像集α(整数(x*25))
newSurf.set_alpha(int(x*25))
screen.blit(newSurf,(xText,35))
pygame.display.update((xText,35),((xText+newSurf.get_width()),(50+newSurf.get_height()))
图像集α(255)
elif x>(除法器-15):
较慢=3
其他:
较慢=0
第一次=错误
blit(img,((xStart-(x*增量)+较慢),100))
pygame.display.update(((xStart-(x*增量)+较慢),100),(95450))
pygame.draw.rect(屏幕,(0,0,0),((xStart-(x*增量)+较慢),100),(95450)))
sleer
变量是为了在杆到达其横扫的最左侧和最右侧时提供惯性感觉,它将稍微降低速度

firstTime
变量用于第一次出现时在条形图中淡出


下面还有一个非常类似的循环,但它会以另一种方式将图像扫回。

这种撕裂只是屏幕渲染方式的产物。线的下一个位置正在渲染,而上一个位置正在绘制。如果屏幕的刷新率和更新率是同步的,则此问题消失。但由于这几乎不可能做到准确,我建议让您的程序采用PICO-8在管理这一点时所采用的方法,在更改屏幕缓冲区以防止撕裂之前,等待屏幕刷新完成。我不确定是否有等待屏幕刷新完成的方法,但如果有,那么顺序应该是:
更新回缓冲区->等待屏幕停止绘制->翻转缓冲区->再次绘制屏幕


刷新是指屏幕从左到右、从上到下逐像素绘制。这是因为与屏幕的三总线连接一次只允许一个像素的亮度来自屏幕内存,因此每个像素都是按顺序绘制的。撕裂来自于内存在刷新过程中的中途更改,因此线在屏幕的中间位置移动。

我知道您提供给我们的代码是一个伪代码,但为什么要先更新屏幕,然后再绘制矩形?顺便说一句,它应该是
pygame.draw.rect(屏幕,(0,0,0),((x,y),(w,h))
,因为第三个参数是
pygame.rect
对象:)啊,是的,抛出伪时错过了我们的几个括号,我现在就编辑,好点!)我在更新后画了这个矩形,因为它是在一个循环中运行的,这个矩形是在图像的前一个位置画的,我可以把这个矩形画移到第一行代码,它会表现出sameNo的问题:)如果可能的话,你能发布你的主游戏循环代码吗?不幸的是,这实际上不是一个游戏,我正在使用pygame,所以我可以为我的Python程序制作一个漂亮的GUI。给我一分钟,我会发布代码的相关部分