【问题标题】:Limit loop frame rate限制循环帧率
【发布时间】:2014-09-09 11:26:53
【问题描述】:

就像pygame 一样,我想限制循环的帧速率。 Pygame 提供了 pygame.time.Clock.tick() 方法:

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

但是如何在 python 中本地实现呢?

举例说明:

import time

max_frames = 125 # 25*5
current_frame = 1
while current_frame <= max_frames:
    print('frame', time.clock(), current_frame)
    current_frame += 1

生产:

('frame', 0.01, 1)
('frame', 0.01, 2)
('frame', 0.01, 3)
[...]
('frame', 0.01, 124)
('frame', 0.01, 125)

我想要每秒 25 帧,所以

('frame', 0.01, 1)
('frame', 0.05, 2)
('frame', 0.08, 3)
[...]
('frame', 4.98, 124)
('frame', 5.00, 125)

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用 time.sleep(1./25) 等待 1/25 秒。

    while current_frame <= max_frames:
        # ... do stuff 
        time.sleep(1./25)
    

    请注意,无论循环体花费多少时间,它都会另外等待那个时间。或者,记住上次执行时间并等到这次 + 1/25 秒。

    while current_frame <= max_frames:
        start = time.time()
        # ... do stuff that might take significant time
        time.sleep(max(1./25 - (time.time() - start), 0))
    

    【讨论】:

    • 好方法,谢谢!我刚刚阅读了自 python 3.3 以来不推荐使用的 time.clock()
    【解决方案2】:

    假设“在 python 中原生”是指使用 Python 标准库,time 模块确实提供了足够的构建块,但它很可能不是你想要的。本质上,帧速率限制只是等待适当的时间过去:

    from time import time, sleep
    
    fps=5
    frameperiod=1.0/fps
    now=time()
    nextframe=now+frameperiod
    for frame in range(120):
      print frame, now
      while now<nextframe:
        sleep(nextframe-now)
        now=time()
      nextframe+=frameperiod
    

    clock 在这里不起作用的原因是它测量处理器时间而不是墙上时间。

    但是,这种方法有几个缺陷:

    1. 它不同步到合适的更新事件(例如监视器帧)
    2. 内环可以补偿下冲,但不能补偿过冲
    3. 这里没有对外部事件做出反应的设施

    所有这些都是使用更紧密联系或更高级框架的充分理由。例如,将等待时间折叠成select 或类似的(像asyncore 或Twisted 之类的主循环的一部分)可以快速响应事件,Kivy 可以帮助您在不处理帧的情况下完成time based animation,Pygame可以sync with the monitor 给定适当的标志并提供evenly spaced events(虽然interval timers 也可以这样做,但它们在Windows 上不起作用并且需要信号处理)。

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2011-09-23
      • 2020-04-07
      相关资源
      最近更新 更多