4

我正在尝试移动此图像:

在此处输入图像描述

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

在此处输入图像描述

我使用的代码是一个类似于这样的循环:

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)为 a .flip()(因为在使用时建议这样做DOUBLEBUF?)

在 GPU 和 CPU 之间拆分内存(我在树莓派 2 上运行它)我尝试同时提供更多内存,没有任何变化。

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

向左或向右调整每个增量的大小,使增量更小会减少撕裂,但也会降低速度。(不能让它太慢

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

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

我宁愿从 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)))

这个slower变量是为了给人一种惯性的感觉,当横杆到达它扫过的最左边和最右边时,它会放慢一点速度。

firstTime变量用于在条形图首次出现时淡入淡出。

在此下方还有另一个非常相似的循环,但将图像扫回另一种方式。

4

2 回答 2

1

vsync = true

pygame.display.set_mode()

于 2021-08-19T20:07:26.867 回答
0

这种撕裂只是屏幕渲染方式的产物。线的下一个位置正在渲染,而前一个位置正在被绘制。如果屏幕的刷新率和更新率是同步的,那么这个问题就会消失。但是由于几乎不可能准确地做到这一点,我建议让您的程序采用 PICO-8 管理此问题的路线,等待屏幕刷新完成,然后再更改屏幕缓冲区以防止撕裂。我不确定是否有等待屏幕刷新完成的方法,但如果有,那么序列应该是:update back buffer -> wait for screen to stop being drawn -> flip buffers -> screen is drawn again.

刷新是从左到右、从上到下、逐个像素地绘制屏幕。这是因为与屏幕的三重总线连接只让一个像素的亮度一次来自屏幕内存,因此每个像素都是按顺序绘制的。撕裂来自于记忆在刷新中途发生变化,因此线条在屏幕中间移动位置。

于 2019-04-21T16:48:35.360 回答