Я читал, что скорость игровых объектов не должна ограничиваться FPS, а должна зависеть от времени. Как можно разделить код обновления / прорисовки, чтобы максимизировать производительность, не ограничивая скорость прорисовки и обеспечивая постоянную частоту обновления логики в зависимости от времени?
Мой текущий псевдокод выглядит следующим образом
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
Проблема в том, что код рисования препятствует повышению скорости обновления (). И он потребляет 100% процессорного времени, потому что если включить режим сна, он отбрасывает обе функции рисования / логики.
Я также использую SDL, и у него нет опции vsync. Я также слышал о терминах фиксированный и переменный шаг по времени, однако я не уверен, как это можно сделать с помощью сна ()
sdl
frame-rate
logic
fixed-timestep
Оскенсо Каши
источник
источник
Ответы:
В вашем фрагменте кода похоже, что вы пытаетесь запустить игру в режиме фиксированного шага, ожидая занятости, если ваш рисунок и обновление заняли менее 15 мс (60 кадров в секунду). Это возможно, и вы правильно догадались, что это невозможно сделать с помощью вызова в режиме сна, потому что вы точно не знаете, как долго вы собираетесь спать. Петля занятого ожидания - хорошее решение.
Однако рассмотрим случай, когда ваши обновления и рисования превышают 15 мс, теперь у вас есть игровой рисунок и обновление замедляться. Теперь вы можете сделать две вещи: обнаружить это состояние и пропустить кадры (пропустить рисование и перейти непосредственно к обновлению, пока вы не синхронизируете снова), однако, если компьютер просто замедляется, он никогда не нагонит.
Другое решение - сделать вашу логику обновления фиксированной по времени независимой. Для этого вам не нужна отдельная тема, вам просто нужно указать, как быстро все должно двигаться. Вместо 5 пикселей на тик, вы должны использовать 50 пикселей в секунду. Для этого вам понадобится высокоточный таймер, и вся ваша логика обновления должна иметь доступ к таймеру, чтобы увидеть, сколько времени прошло с момента последнего обновления.
В основном вы идете из:
к
источник