【问题标题】:pygame clock.tick() vs framerate in game main looppygame clock.tick() vs 游戏主循环中的帧率
【发布时间】:2016-03-26 19:29:19
【问题描述】:

每个 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)

根据get_ticks()的api:

返回自调用 pygame.init() 以来的毫秒数。 在 pygame 初始化之前,它总是为 0。

但是clock.tick()

这个方法应该每帧调用一次。它将计算有多少 .自上次调用以来已经过去了毫秒。

如果您传递可选的帧速率参数,则函数将延迟以保持游戏运行速度低于给定的每秒滴答数。这可以用来帮助限制游戏的运行速度。通过每帧调用一次 Clock.tick(40),程序将永远不会以每秒超过 40 帧的速度运行。

我有点疑惑,是不是说clock.tick()直接影响到游戏开始后经过了多少毫秒?

所以clock.tick(40) 意味着我每秒“发出” 40 帧,而 while 循环每秒运行 40 次?

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

更新: 我实际上只是对其进行了测试,无论您给tick() - 0.13060 提供什么fps,get_ticks() 仍然以mls 为单位返回实时时间。

看来clock.tick() 只是设置了游戏应该运行多快或while 循环应该多久更新一次,运行一次

不过还是有点疑惑,欢迎其他答案。

【问题讨论】:

    标签: python pygame frame-rate pygame-clock pygame-tick


    【解决方案1】:

    FPS每秒帧数,是每单位时间显示的帧数。
    1 / FPS是数量每帧之间应该经过的时间。
    滴答声只是 PyGame 中的时间度量。

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

    【讨论】:

    • 不仅如此!我想要更深入的解释,但谢谢!基本上 clock.tick(3) 告诉主循环:以每秒 3 帧的速度运行自己,这不会影响游戏的实际实时时间。
    【解决方案2】:

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

    我认为由于高 FPS,时间过得更快!它没有,我尝试了 clock.tick(0.1) - 也就是每 10 秒 1 帧,而 get_ticks() 仅打印出其经过的时间 每 10 秒一次! 因为 while 循环正在运行在 fps = 0.1 时。

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

    现在我想通了。

    【讨论】:

      【解决方案3】:

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

      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,另一次每秒帧数等于 1,然后我们将运行代码 10 秒“我用我的手机秒表来执行此操作”。

      所以在数学上,10 秒内 1 fps 是正确的 10,而 10 秒内 10 fps 是 100 “duuh” 所以你应该在第一次运行“1 fps”时运行计数器变量应该在 10 左右“取决于你的时间”,而在控制台中 10 秒计数器变量结束时的第二次运行应该在 100 左右

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

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多