python-3.x - Pygame:display.update() 直到时钟延迟后才会更新
问题描述
我正在使用 pygametime.Clock
以较低的 FPS 运行我的游戏,我注意到我的输入似乎需要额外的一帧才能生效。我做了一些调试并意识到这不是问题,pygame.event.get()
而是pygame.display.update()
. 我编写了一个简单的程序来演示这个问题:(程序说明在代码片段下方)
import pygame, sys
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
colour = 1
key_press = False
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
screen.fill((0,255,0))
key_press = True
print("A key was pressed.")
if not key_press:
screen.fill((colour*255, colour*255, colour*255))
colour = not colour
else:
key_press = False
pygame.display.update()
clock.tick(0.5)
程序每两秒在黑白之间闪烁屏幕,每当按下任何键时,屏幕都会变为绿色并"A key was pressed"
打印到控制台。但是,当我运行它时,文本会在正确的时间打印,但屏幕直到下一帧才会变为绿色。这让我相信pygame.display.update()
当我调用函数时不会更新屏幕。
问题似乎与调用后的延迟有关pygame.display.update()
。如果您更改时钟的 FPS,问题仍然存在。如果您使用time.wait()
或pygame.time.delay()
代替延迟,也会发生这种情况Clock.tick()
。
我注意到的另一件有趣的事情是,如果您颠倒我示例中最后两行代码的顺序 (pygame.display.update()
和clock.tick(0.5)
),您可能会期望屏幕会在按下一个键而不是一个键后更改两个时钟周期。但是,如果我这样做,我会得到与其他顺序完全相同的效果。
我不确定这是否是一个错误,或者我只是错过了这里发生的一些微妙的事情。我正在运行 Python 3.6.2 并在 macOS 上使用 Pygame v1.9.3。您可以提供的任何帮助将不胜感激!
解决方案
我可以通过在 pygame.display.update() 调用和时钟之间调用 pygame.event.pump() (它不会清除事件队列,因此不会丢失事件处理)来修复一个程序中的这个故障。滴答(FPS)调用。基本上,我的主要游戏循环以:
pygame.display.update()
pygame.event.pump()
clock_object.tick(FPS_CONSTANT)
推荐阅读
- random-forest - 如何仅获得概率大于 x 的预测
- keras - Keras-tuner Hyperband 仅运行 2 个 epoch
- sql - 性能调优 SparkSQL 查询(带反连接)
- java - JAVA:图形创建
- javac - 为什么我只能在cmd中以管理员身份运行javac?
- json - 如何在 Delphi 中解析这种类型的 JSON 数据?
- visual-studio-code - VSCode 可以逐行进行块注释吗?
- azure-devops - 在敏捷过程中向 Azure DevOps 错误添加“已删除”状态的影响
- python - 如何根据附加列表中的条件选择一些值?
- sql-server - 查找为 EC1 区域中的每个账户创建的第三大报价