Тайминг анимации Python

В настоящее время я работаю над инструментом листа спрайтов в python, который экспортирует организацию в документ xml, но я столкнулся с некоторыми проблемами, пытаясь оживить предварительный просмотр. Я не совсем уверен, как рассчитать частоту кадров с помощью python. Например, предполагая, что у меня есть все необходимые данные о кадрах и функции рисования, как мне кодировать синхронизацию, чтобы отображать ее со скоростью 30 кадров в секунду (или с любой другой произвольной скоростью).


person eriknelson    schedule 18.04.2010    source источник


Ответы (3)


Проще всего это сделать с помощью Pygame:

import pygame
pygame.init()

clock = pygame.time.Clock()
# or whatever loop you're using for the animation
while True:
    # draw animation
    # pause so that the animation runs at 30 fps
    clock.tick(30)

Второй самый простой способ сделать это вручную:

import time

FPS = 30
last_time = time.time()
# whatever the loop is...
while True:
    # draw animation
    # pause so that the animation runs at 30 fps
    new_time = time.time()
    # see how many milliseconds we have to sleep for
    # then divide by 1000.0 since time.sleep() uses seconds
    sleep_time = ((1000.0 / FPS) - (new_time - last_time)) / 1000.0
    if sleep_time > 0:
        time.sleep(sleep_time)
    last_time = new_time
person Daniel G    schedule 18.04.2010
comment
Спасибо, очень полезно. Я новичок в Python, но усердно работаю над тем, чтобы лучше с ним познакомиться. - person eriknelson; 18.04.2010

В модуле threading есть класс Timer. Это может быть удобнее, чем использование time.sleep для некоторых целей.

>>> from threading import Timer
>>> def hello(who):
...    print 'hello %s' % who
... 
>>> t = Timer(5.0, hello, args=('world',))
>>> t.start()      # and five seconds later...
hello world
person Matt Anderson    schedule 18.04.2010

Вы могли бы использовать select ? Он обычно используется для ожидания завершения ввода-вывода, но взгляните на сигнатуру:

select.select(rlist, wlist, xlist[, timeout])

Итак, вы можете сделать что-то вроде:

timeout = 30.0
while true:
    if select.select([], [], [], timeout):
        #timout reached
        # maybe you should recalculate your timeout ?        
person dzen    schedule 18.04.2010
comment
тайм-аут для выбора в секундах. ОП хотел 30 кадров в секунду, поэтому я думаю, что это не сработает. - person gazhay; 26.05.2018