[英]Limit loop frame rate
就像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)
您可以只使用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”是指使用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
在这里不起作用的原因是它测量的是处理器时间,而不是墙上的时间。
但是,这种方法有两个缺陷:
所有这些都是使用更紧密或更高级的框架的充分理由。 例如,将等待时间放到选择的或类似的内容中( 异步循环或Twisted之类的主循环的一部分)可以快速响应事件,Kivy可以帮助您进行基于时间的动画,而无需处理帧,而Pygame可以与监视给定的适当标志并提供间隔均匀的事件 (虽然间隔计时器也这样做,但它们在Windows上不起作用,并且需要信号处理)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.