Pygame 时钟滴答停顿
Pygame clock tick stuttering
这个问题已经困扰我几个星期了。每当我有一个 pygame 时钟变量时,例如:clock = pygame.time.clock
并且我使用以下方法限制 fps:clock.tick(fps)
游戏偶尔会卡顿。我在下面有一个简单的例子——一个 window 的立方体从一边移动到另一边。
import pygame
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
width, height = screen.get_size()
rect = pygame.Rect(0, height // 2 - 50, 100, 100)
delta_x = 5
clock = pygame.time.Clock()
running = True
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0))
if rect.left < 0 or rect.right > width:
delta_x *= -1
pygame.draw.rect(screen, (255, 255, 255), rect)
rect.x += delta_x
pygame.display.flip()
clock.tick(60)
视频:https://www.youtube.com/watch?v=6spFoKIqVQY&ab_channel=NotAHackusator
有谁知道如何解决这一问题?提前致谢。
将 clock.tick 从 60 设置为 144 可以让卡顿消失。我不确定您是否希望将其限制为 60 以及为什么。
实际上有些东西可能有助于提高性能(因为不稳定的性能会导致断断续续的接缝。至少在我的情况下,它有助于断开显示和计算,这意味着您可以使用自定义 FPS 限制器来限制 FPS。
示例:
# In your game-loop:
cur_ticks = pygame.time.get_ticks()
if cur_ticks - last_ticks > 1000//60: # your framerate, also known as FPS, here 60
# your draw code and display.update goes here
last_ticks = pygame.time.get_ticks()
clock.tick(60) # number of computation steps per second, should be greater equal to FPS-value
您需要在 game-loop 之前将 last_ticks
初始化为零或 pygame.time.get_ticks()
的当前值。
对于我的游戏,与通常的方法相比,这将 FPS 从 40 FPS 提高到 50 FPS。
它也可能有助于将 clock.tick
值增加到更高的值,例如 120。这样 FPS 仍然限制在 60,但允许更多的计算步骤。
在我的例子中,这有助于将计算数量 steps/second 提高到 60 以上,也意味着 60 FPS(用于显示)。要保持 game-objects 的速度“恒定”,则需要您根据当前 FPS-value 更改它们的速度。这有助于接缝的原因是 tick
非常“重”。
这个问题已经困扰我几个星期了。每当我有一个 pygame 时钟变量时,例如:clock = pygame.time.clock
并且我使用以下方法限制 fps:clock.tick(fps)
游戏偶尔会卡顿。我在下面有一个简单的例子——一个 window 的立方体从一边移动到另一边。
import pygame
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
width, height = screen.get_size()
rect = pygame.Rect(0, height // 2 - 50, 100, 100)
delta_x = 5
clock = pygame.time.Clock()
running = True
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0))
if rect.left < 0 or rect.right > width:
delta_x *= -1
pygame.draw.rect(screen, (255, 255, 255), rect)
rect.x += delta_x
pygame.display.flip()
clock.tick(60)
视频:https://www.youtube.com/watch?v=6spFoKIqVQY&ab_channel=NotAHackusator
有谁知道如何解决这一问题?提前致谢。
将 clock.tick 从 60 设置为 144 可以让卡顿消失。我不确定您是否希望将其限制为 60 以及为什么。
实际上有些东西可能有助于提高性能(因为不稳定的性能会导致断断续续的接缝。至少在我的情况下,它有助于断开显示和计算,这意味着您可以使用自定义 FPS 限制器来限制 FPS。
示例:
# In your game-loop:
cur_ticks = pygame.time.get_ticks()
if cur_ticks - last_ticks > 1000//60: # your framerate, also known as FPS, here 60
# your draw code and display.update goes here
last_ticks = pygame.time.get_ticks()
clock.tick(60) # number of computation steps per second, should be greater equal to FPS-value
您需要在 game-loop 之前将 last_ticks
初始化为零或 pygame.time.get_ticks()
的当前值。
对于我的游戏,与通常的方法相比,这将 FPS 从 40 FPS 提高到 50 FPS。
它也可能有助于将 clock.tick
值增加到更高的值,例如 120。这样 FPS 仍然限制在 60,但允许更多的计算步骤。
在我的例子中,这有助于将计算数量 steps/second 提高到 60 以上,也意味着 60 FPS(用于显示)。要保持 game-objects 的速度“恒定”,则需要您根据当前 FPS-value 更改它们的速度。这有助于接缝的原因是 tick
非常“重”。