簡體   English   中英

極限環幀率

[英]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在這里不起作用的原因是它測量的是處理器時間,而不是牆上的時間。

但是,這種方法有兩個缺陷:

  1. 它不會同步到合適的更新事件(例如監視器幀)
  2. 內循環可以補償欠調,但不能補償過調
  3. 這里沒有對外界事件做出反應的設施

所有這些都是使用更緊密或更高級的框架的充分理由。 例如,將等待時間放到選擇的或類似的內容中( 異步循環或Twisted之類的主循環的一部分)可以快速響應事件,Kivy可以幫助您進行基於時間的動畫,而無需處理幀,而Pygame可以與監視給定的適當標志並提供間隔均勻的事件 (雖然間隔計時器也這樣做,但它們在Windows上不起作用,並且需要信號處理)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM