2011-12-05 203 views
1

我希望我的程序每x幀完成一項任務。然而,它似乎並不奏效,因爲python中的計時器似乎不準確。我如何獲得這段代碼來遵守我設定的幀率?在python中限制FPS

import time 
fps = 5 
skipticks = 1/(fps*1.0) 
i= 0 
nextsnap=time.clock() 
print skipticks, fps 
while (True): 
    tim= time.clock() 
    i=i+1 
    # this prints the fps 
    #'print 'Fps at start',i, 1/(time.time()-tim) 
    # this is the sleep that limits the fps 
    nextsnap+=skipticks 
    sleeptime = nextsnap-time.clock() 
    if (sleeptime>0): 
     time.sleep (sleeptime) 
    else: 
     print 'took too long' 
    print 'Fps at end:#', i, 1/(time.clock()-tim) 

這將產生在我的電腦上:

Fps at end:# 45 4.36627853079 
Fps at end:# 46 6.44119324776 
Fps at end:# 47 4.53966049676 
Fps at end:# 48 4.66471670624 
Fps at end:# 49 7.18312473536 
Fps at end:# 50 4.34786490268 
Fps at end:# 51 6.5263951487 
Fps at end:# 52 4.71715853908 
Fps at end:# 53 4.59636712435 
Fps at end:# 54 6.87201830723 
Fps at end:# 55 4.31062740848 

爲什麼有被渲染得太快幀?爲什麼fps計數不準確?

+3

你假設你的邏輯立即運行,而不是。 – Blender

+1

如果你在每一幀顯示它,時鐘是什麼時候?您可能必須隨時間測量幀速率,然後調整跳幀,而不是訪問每幀的時鐘。 –

+0

這將是我試圖實施的屏幕抓圖工具。循環中會有一個ImageGrab.grab()。由於我採用屏幕截圖,所以幀率穩定運行非常重要,否則視頻將無法平穩運行 – tarrasch

回答

4

如果它是關於mesuring你可以有time.clock()time.sleep()的準確性,使用盡可能像這樣簡單的事情:

import time 

fps = 5 
time_delta = 1./fps 

while True: 
    t0 = time.clock() 
    time.sleep(time_delta) 
    t1 = time.clock() 
    print 1./(t1 - t0) 

你是什麼操作系統,什麼是這個簡單的MESURE的結果呢?

如果是有關清潔你的代碼,我會分離更清楚FPS評價,則處理睡眠通話。這裏是一個例子(顯示的循環#0頻率應該被忽略)。

import time 
import random 
from itertools import count 

fps = 5 
loop_delta = 1./fps 

current_time = target_time = time.clock() 
for i in count(): 
    #### loop frequency evaluation 
    previous_time, current_time = current_time, time.clock() 
    time_delta = current_time - previous_time 
    print 'loop #%d frequency: %s' % (i, 1./time_delta) 

    #### processing 
    # processing example that sleeps a random time between 0 and loop_delta/2. 
    time.sleep(random.uniform(0, loop_delta/2.)) 

    #### sleep management 
    target_time += loop_delta 
    sleep_time = target_time - time.clock() 
    if sleep_time > 0: 
     time.sleep(sleep_time) 
    else: 
     print 'took too long' 

此外,你可能想time.time()而非time.clock()。請參閱time.clock() vs. time.time() - accuracy的答案。

0

python documentation解釋了爲什麼time.sleep不是很準確。

你在使用什麼操作系統?

如果您使用的是linux,您可以使用powernap,它使用Linux的實時時鐘(RTC)來獲得更準確的時序。