Это зависит от того, чего вы хотите достичь. Некоторые игры предпочитают, чтобы игровая логика выполнялась чаще, чем частота кадров (я считаю, что исходные игры делают это), для некоторых игр вы можете захотеть, чтобы игровая логика выполнялась реже (единственный пример этого, который я могу придумать, - это серверы некоторые многопользовательские игры, в частности Overwatch).
Также важно учитывать, что это вопрос разрешения, а не скорости. Игра с логической частотой 120 и частотой кадров 60 не обязательно работает на скорости x2, любые критические по времени операции в игровой логике должны выполняться относительно часов *, а не частоты тиков, иначе ваша игра буквально перейдет в замедленное движение, если рендеринг кадров занимает слишком много времени.
Я бы порекомендовал написать такой цикл:
loop do
time_until_update = (update_interval + time_of_last_update) - current_time
time_until_draw = (draw_interval + time_of_last_draw) - current_time
work_done = false
# Update the game if it's been enough time
if time_until_update <= 0
update
time_of_last_update = current_time
work_done = true
end
# Draw the screen if it's been enough time
if time_until_draw <= 0
clear_screen
draw
time_of_last_draw = current_time
work_done = true
end
# Nothing to do, sleep for the smallest period
if work_done == false
smaller = time_until_update
if time_until_draw < smaller
smaller = time_until_draw
end
sleep_for(smaller)
end
# Leave, maybe
break if window_is_closed
end
Вы не хотите ждать 16 мсек на каждый кадр, иначе вы можете переждать, если для завершения кадра потребуется нетривиальное количество времени. Переменная work_done
предназначена для того, чтобы мы знали, действительны ли интервалы, которые мы вычислили в начале цикла, возможно, мы сделали 5 мс работы, что полностью нарушило бы наш сон, поэтому в этом сценарии мы возвращаемся и вычисляем свежие ценности.
* Вы можете абстрагировать часы, использование часов напрямую может иметь некоторые странные эффекты, например, если вы сохраняете игру и сохраняете последний раз, когда вы использовали магическую силу в качестве времени часов, они мгновенно отключаются, когда вы загрузите сохранение, так как это теперь минуты, часы или даже дни в прошлом. Аналогичные проблемы существуют и с процессом, приостановленным операционной системой.
person
user573949
schedule
10.06.2017
clear_screen
шаг. Это потенциально дорого и не всегда необходимо. Вызывающий может захотеть очистить только небольшие разделы, которые были изменены, чтобы сэкономить время процессора. - person Carcigenicate   schedule 07.06.2017