[英]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.