pygame - Circle以60 + fps截止,由display.flip修复

时间:2014-06-12 06:46:22

标签: python pygame

以下代码绘制一个圆圈并将其向左移动4px。

问题是,在 60 fps或更高时,圆圈会闪烁,有时看起来会切断给我(大约如下图所示)。闪烁不像屏幕闪烁,更像是在整圆和截止圆之间的状态切换。这个问题根本不会发生高达45 fps,无法通过屏幕捕获或暂停游戏来重现,好像问题只能用肉眼看到。

现在,可能有两种可能性:

  • 屏幕未在所需区域更新。

更新代码都不依赖于fps,因此闪烁应该与fps无关。但是,问题以30/45 fps消失。但是,令人惊讶的是,如果使用display.flip而不是更新,它也会被修复。

  • V-sync / monitor刷新问题

其他一些pygame闪烁问题提到了这个问题。我认为软件渲染没有这个问题,但不是很确定。另外,为什么display.flip会解决这个问题?

import pygame
w,h=800,200
fps=60
pygame.init()
screen = pygame.display.set_mode([w, h])
color=pygame.Color("white")
clock=pygame.time.Clock()
radius=20
x,y=800,100
def get_bbox(x,y):
    left = x - radius
    top = y - radius
    width = radius * 2
    height = radius * 2
    return pygame.Rect((left, top), (width, height))

while True:
    old_x=x
    x-=4
    screen.fill(pygame.Color("black"),get_bbox(old_x,y))
    pygame.draw.circle(screen, color, (x, y), radius, 1)
    pygame.display.update([get_bbox(x,y),get_bbox(old_x,y)])
    clock.tick(fps)

Cut-off circle

1 个答案:

答案 0 :(得分:-1)

签出Pygame's docs on display ..

在display.update:

上说
  

此功能类似于pygame.display.flip()的优化版本   用于软件显示。 它只允许屏幕的一部分   更新,而不是整个区域。如果没有参数传递它   更新整个Surface区域,如pygame.display.flip()。

对于display.flip:

  

这将更新整个显示的内容。如果您的显示   模式是使用标志pygame.HWSURFACE和pygame.DOUBLEBUF,这个   将等待垂直回扫并交换曲面。如果你是   使用不同类型的显示模式,它只会更新   表面的全部内容。

     

使用pygame.OPENGL显示模式时,这将执行gl缓冲区   交换

哪个应该回答你的问题。为什么.flip会绘制整个圆圈而不是.update。