2014-09-09 6 views
0

Как и у 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) 

ответ

0

Вы могли бы просто использовать 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)) 
+0

Хороший способ поблагодарить! Я просто прочитал, в какое время .clock() отменяется с python 3.3 – bux

0

Предполагая, что «изначально в питон» вы имеете в виду, используя стандартную библиотеку 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. Там нет возможности реагировать на внешние события здесь

Все это веские причины, чтобы использовать более тесно связаны и более высокие рамки уровня. Например, складывание времени ожидания в select или аналогичное (часть основной петли таких вещей, как asyncore или Twisted) позволяет быстро реагировать на события, Kivy может помочь вам сделать time based animation, не имея дел с фреймами, а Pygame может sync with the monitor, учитывая соответствующие флаги как а также предоставить evenly spaced events (в то время как interval timers также делают это, они не работают в Windows и требуют обработки сигналов).

Смежные вопросы