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

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

何昆
2023-03-14

我试图移动这个图像:

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

我使用的代码是类似于此的循环:

screen.blit(img, (x,y))
pygame.update((x,y),(w,h))
pygame.draw.rect(screen,(0,0,0),((x,y),(w,h)))

到目前为止,我已经尝试了以下方法来解决这个问题:

在创建屏幕时使用HWSURFACE全屏DOUBLEBUF标志,这没有效果,我也调整了。将(rect)更新为。flip()(因为使用DOUBLEBUF?)时建议使用此选项)

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

设置时钟。勾选以将更新速度限制在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)))

sleer变量是为了在杆到达其横扫的最左侧和最右侧时提供惯性感觉,它将稍微降低速度。

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

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

共有2个答案

夏志国
2023-03-14

设置

vsync = true

pygame.display.set_mode

商正浩
2023-03-14

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

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

 类似资料:
  • 我被屏幕撕裂问题困扰了大约一周。 这里是我的问题:我想做一个程序,可以显示一个PNG图片序列非常快(以30帧或以上的速度)。为此,我使用pygame库,尤其是和。 下面是一个代码示例(带有自制的延迟功能): 计时器允许我在屏幕上有相同的刷新率。我的问题是,一个人可以亲眼看到屏幕撕裂问题(https://en.wikipedia.org/wiki/Screen_tearing)。在pyplay留档他

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

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

  • 每当我试图制作一个蛇游戏时,这仍然是不完整的,每当我的蛇与边界碰撞时,它就会进入下一个屏幕a 你真差劲再试试 但如果我双击pygame窗口的任何地方,它有时会崩溃。 左点击的次数不止2次,但最终点击一段时间后仍然会崩溃。 我必须做些什么来解决这个问题,因为在我玩蛇的初始屏幕上没有这个问题。 我使用的代码如下所示:

  • 问题内容: 我有一个div,当我的页面首次加载时,它离顶部约100像素(该页面包含一些按钮等)。 当用户滚动通过它时,我希望div“关注”该用户,因为它附着在屏幕顶部。当用户返回页面顶部时,我希望它返回到其原始位置。 问题答案: 诀窍是您必须将其设置为position:fixed,但仅在用户滚动经过它之后才能设置。 可以通过将处理程序附加到window.scroll事件来完成此操作 当页面滚动经过

  • 我是pygame的新手,我需要一些帮助,因为我的代码工作不正常。 好的,问题是:我希望屏幕在运行时变为白色,但它仍然是黑色的,但是当我按下退出按钮时,它会变为白色大约一秒钟,然后关闭。 当我放一张图片(像player.png)时,也会发生这种情况,它会在退出前出现大约一秒钟。我不知道我做错了什么, 请帮助修复代码并解释为什么会发生这种情况? 代码如下: 另外,我没有发现任何错误