Python проклинает частоту кадров приложения - PullRequest
0 голосов
/ 23 октября 2019

Я пишу время кубика Рубика в python для терминала, используя curses. Поэтому мне нужно иметь чрезвычайно точную частоту кадров.

Каждый кадр должен иметь продолжительность точно 0,01 секунды. Для этого я должен учитывать время, необходимое для выполнения кода для каждого кадра.

Я думал, что у меня будет система, в которой каждый раз, когда я сплю, я жертвую столько, сколько могу, чтобы получитьЗадержка возвращается к 0 в минимально возможном количестве кадров.

import time

delay = 0  # how far behind the program is
while True:
    start_time = time.time()

    # update screen, do other processes

    duration = time.time() - start_time
    if (duration + delay) > 0.01:
        # can't make it back to on-time right now
        # by not sleeping, we have saved (0.01 - duration) seconds
        delay -= 0.01 - duration
    else:
        time.sleep(0.01 - (duration + delay))

Теоретически для этого набора можно использовать любой набор из 5 кадров, в котором общее время, затрачиваемое на обновление экрана и выполнение процессов, меньше. меньше или равно 0,05 секунды, программа должна завершиться вовремя (что в кубическом таймере Рубика является наиболее важной вещью), что составляет ровно 0,05 секунды.

Однако, когда я запускаю этот скрипт:

import time
import timeit

# these are the amounts of time the processes will take for each frame.
times = [0.01, 0.01, 0.01, 0.01, 0.01]


def func():
    delay = 0

    for t in times:
        start_time = time.time()

        time.sleep(t)

        duration = time.time() - start_time
        if (duration + delay) > 0.01:
            delay -= 0.01 - duration
        else:
            time.sleep(0.01 - (duration + delay))

print((timeit.timeit(func, number=100)) / 100)

В зависимости от того, какие значения я поместил в список time (убедившись, что они имеют сумму, меньшую или равную 0,05), я получаю другое время, иногда даже медленное, как 0,057 секунды!

Какая часть этого кода может быть причиной медленной работы программы? И как мне это исправить?

...