以下代码绘制一个圆圈并将其向左移动4px。
问题是,在 60 fps或更高时,圆圈会闪烁,有时看起来会切断给我(大约如下图所示)。闪烁不像屏幕闪烁,更像是在整圆和截止圆之间的状态切换。这个问题根本不会发生高达45 fps,无法通过屏幕捕获或暂停游戏来重现,好像问题只能用肉眼看到。
现在,可能有两种可能性:
更新代码都不依赖于fps,因此闪烁应该与fps无关。但是,问题以30/45 fps消失。但是,令人惊讶的是,如果使用display.flip
而不是更新,它也会被修复。
其他一些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)
答案 0 :(得分:-1)
在display.update:
上说此功能类似于pygame.display.flip()的优化版本 用于软件显示。 它只允许屏幕的一部分 更新,而不是整个区域。如果没有参数传递它 更新整个Surface区域,如pygame.display.flip()。
对于display.flip:
这将更新整个显示的内容。如果您的显示 模式是使用标志pygame.HWSURFACE和pygame.DOUBLEBUF,这个 将等待垂直回扫并交换曲面。如果你是 使用不同类型的显示模式,它只会更新 表面的全部内容。
使用pygame.OPENGL显示模式时,这将执行gl缓冲区 交换
哪个应该回答你的问题。为什么.flip会绘制整个圆圈而不是.update。