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 非常“重”。