pygame clock.tick() vs 游戏主循环中的帧率

pygame clock.tick() vs framerate in game main loop

每个 pygame 都有一个游戏循环,如下所示:

while running:
    for event in pygame.event.get():        
        if event.type == pygame.QUIT:
            running = False   
    pygame.display.flip()
    print("tick " + str(pygame.time.get_ticks()))
    clock.tick(1)

根据api为get_ticks():

Returns the number of millisconds since pygame.init() was called. Before pygame is initialized this will always be 0.

但是clock.tick():

This method should be called once per frame. It will compute how many . milliseconds have passed since the previous call.

If you pass the optional framerate argument the function will delay to keep the game running slower than the given ticks per second. This can be used to help limit the runtime speed of a game. By calling Clock.tick(40) once per frame, the program will never run at more than 40 frames per second.

有点疑惑,难道说clock.tick()直接影响游戏开始后的毫秒数吗?

所以 clock.tick(40) 意味着我 "issue" 每秒 40 帧,而 while 循环 运行s 每秒 40 次?

我没有看到 fps 和 ticks 之间的关系。

更新: 实际上我刚刚测试了它并且 get_ticks() 仍然是 returns 以 mls 为单位的实时时间,无论你给 tick() - 0.13060.

所以看起来 clock.tick() 只是设置了游戏应该 运行 或 while 循环应该多久更新一次,运行 通过它自己 .

不过还是有点迷糊,欢迎其他回答

FPSFrames Per Second,是每单位时间显示的帧数。
1 / FPS 是每帧之间应该经过的时间量。
Tick 只是 PyGame 中的时间度量。

clock.tick(40) 表示每秒最多 应该通过 40 帧。

我设置了高 fps - clock.tick(30) 或 60, 并且游戏运行速度很快,并且 get_ticks() 打印出经过的时间非常快,但是 pygame.init() 的实际运行时间没有改变!

我觉得时间过得更快是因为 FPS 高!它没有,我试过 clock.tick(0.1) - 也就是每 10 秒 1 帧,并且 get_ticks() 只打印出它的经过时间 每 10 秒一次! 因为 while 循环 运行 在 fps = 0.1 时通过自身。

但如果 fps 更高,更新率会更高 -不是总运行时间

现在我明白了。

我知道已经有人回答了,但我想解释一些我厌倦的事情

import pygame

pygame.init()

gameDisplay = pygame.display.set_mode((800,600))
clock = pygame.time.Clock()

crashed = False

counter = 1
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True

    pygame.display.update()
    print(counter)
    counter += 1
    clock.tick(1) # will be 10 in the next run 

所以我们要做的是让两个 运行 一个每秒帧数等于 1,另一个等于 10,我们将 运行 代码持续 10 秒“我使用我的 phone 秒表可以做到这一点。

所以从数学上讲,10 秒内的 1 fps 是 10,10 秒内的 10 fps 是 100 "duuh" 所以你应该得到 运行ning 第一个 运行 “1 fps” 是计数器变量应该在 10 "depends on your timing" 左右,第二个 运行 在 10 秒结束时控制台中的计数器变量应该在 100

左右

所以,简而言之,我们可以说循环正在控制您的游戏显示 和 clock.tick() 指定您想要更改游戏显示的速度 换句话说循环 运行s

有多快

我来晚了一点,但根据我的研究,我得到了一个答案。适合我这样的初学者,如有不妥欢迎指正。

让我们假设以下循环:

while True:
  # ... Some code which deals with the objects and surfaces
  pygame.display.flip() # displays all the changes we've made to the user
  pygame.clock.tick(60) # code that prevents our framerate from exceeding 60 fps

好的,考虑到上面的代码,假设 pygame.clock.tick 测量从上次调用时起经过的时间

所以假设现在是此循环的第 2 次迭代,tick 方法测得自第一次迭代中最后一次调用以来已经过去了 0.0157 秒。如果我们为此计算 FPS,它将是 1 frame/0.0157 秒(如果您对为什么它是 1 帧感到困惑,那是因为自上次调用以来我们只“更新”了一次用户屏幕tick 方法。1/0.0157 = 63.69 帧/秒。该死!那是每秒 60 多帧。因此,方法 tick 会自动“减慢”您的代码,防止它再次“更新”直到足够的时间过去这样帧速率 = 60 fps。

那么它将如何做到这一点?好吧,使用基础数学我们可以计算出 60 的 FPS 转换为每 0.016 秒 1 帧。所以,如果我们让代码多等待 0.0003 秒,我们将达到 60 帧速率!这是因为如上例所述,0.0157 秒已经过去,因此我们需要在此帧上额外等待 0.0003 秒才能达到我们想要的帧率。

我希望这对任何对此主题感到困惑的人有所帮助。