Устранение задержки ввода (Input Lag)
Input‑лаг (input lag) - это задержка между отправкой сигнала через периферийное устройство (клавиатуру, мышь, геймпад) и отображением соответствующего действия на экране. Проще говоря: вы нажимаете кнопку - а реакция в игре появляется чуть позже.
V‑Sync + буферизация кадров
V‑Sync (вертикальная синхронизация) принудительно синхронизирует частоту кадров игры с частотой обновления монитора. Чтобы избежать разрывов изображения (screen tearing), видеокарта ждёт сигнала от монитора перед выводом следующего кадра.
Пример
В шутере вы нажимаете «прыжок», но персонаж подпрыгивает на полсекунды позже - из‑за того, что команда ждала в буфере.
Способы устранения
-
отключить V‑Sync в настройках игры или драйвера;
-
использовать адаптивный V‑Sync (включается только при превышении FPS частоты обновления);
-
включить G‑Sync / FreeSync - технологии динамической синхронизации, устраняющие разрывы без буферизации;
-
ограничить FPS на 2–3 ниже частоты обновления монитора (например, 57 FPS для 60 Гц).
Обработка ввода в love.draw вместо love.update
В игровом фреймворке LÖVE (Love2D) есть два ключевых цикла:
-
love.update(dt)- вызывается с фиксированной частотой (обычно 60 раз в секунду), предназначен для логики игры: обработка ввода, физика, ИИ, обновление состояния; -
love.draw()- вызывается как можно чаще (зависит от FPS), отвечает только за рендеринг (отрисовку сцены).
Если обрабатывать ввод в love.draw:
-
команды считываются не регулярно, а «когда получится» - в зависимости от FPS;
-
при просадках FPS (например, до 30 кадров/с) ввод опрашивается вдвое реже;
-
возникает непостоянная задержка: то 16 мс, то 33 мс - что делает управление «рваным».
Пример кода с ошибкой:
function love.draw()
if love.keyboard.isDown("space") then
player:jump() -- Обработка ввода в draw → лаг!
end
-- отрисовка...
end
Правильное решение
Перенести обработку ввода в love.update:
function love.update(dt)
if love.keyboard.isDown("space") then
player:jump() -- Ввод обрабатывается регулярно
end
end
function love.draw()
-- Только отрисовка, без логики
end
Почему это работает
love.update вызывается с постоянной частотой независимо от FPS, поэтому ввод фиксируется стабильно и предсказуемо.
Высокая нагрузка на рендеринг
Основные источники нагрузки
-
большое количество объектов на экране;
-
сложные шейдеры (тени, отражения, пост‑обработка);
-
высокое разрешение рендеринга (4K);
-
неэффективная оптимизация кода (частые вызовы отрисовки, отсутствие batching).
Пример
В платформере на уровне с множеством частиц и эффектами:
-
FPS падает с 60 до 35;
-
время кадра скачет: 16 мс → 28 мс → 45 мс;
-
игрок нажимает «прыжок» в момент длинного кадра (45 мс) - реакция задерживается.
Способы устранения
-
Оптимизация рендеринга:
-
снизить разрешение или качество теней;
-
отключить тяжёлые эффекты постобработки;
-
использовать level of detail (LOD) для далёких объектов.
-
-
Профилирование:
-
замерять FPS и время кадра (
love.timer.getFPS(),dtвupdate); -
найти «узкие места» (например, через отладочный оверлей).
-
-
Настройки движка:
-
включить batch rendering для спрайтов;
-
уменьшить количество вызовов отрисовки;
-
кэшировать статические элементы.
-
- 4
