Ограничение Fps в питоне - PullRequest
       71

Ограничение Fps в питоне

1 голос
/ 05 декабря 2011

Я хочу, чтобы моя программа выполняла задачу каждые x кадров. Однако, похоже, что это не работает, из-за того, что таймер в python кажется неточным. Как мне заставить этот кусок кода подчиняться моей установленной частоте кадров?

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

Почему кадры отображаются слишком быстро? И почему количество кадров в секунду неточно?

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Если вы хотите измерить точность, которую вы можете получить с помощью 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 () и time.time () - точность ответ.

0 голосов
/ 12 января 2012

Документация python объясняет, почему time.sleep не очень точен.

Какую ОС вы используете?

Если вы используете Linux, вы можете использовать powernap , который использует часы реального времени Linux (RTC) для более точной синхронизации.

...