Я пишу время кубика Рубика в 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 секунды!
Какая часть этого кода может быть причиной медленной работы программы? И как мне это исправить?