Задержка ввода на ретро-консолях и эмуляторах

8lmcx2irncjqh8nizwlentsybei.jpeg

TL; DR В статье описывается известная проблема задержки ввода (input lag), которая проявляется при попытках играть в старые игры на современном железе: эмуляторах ретро-консолей, bluetooth-геймпадах и т.д. Иногда задержки настолько большие, что играть становится невозможно. Я опишу свой путь поиска приемлемой конфигурации для запуска моих любых игр.

С волной популярности одноплатных компьютеров RaspberryPi, OrangePi многие знакомые накупили себе их пачками. Не придумав что с ними делать, они начали лепить из них ретро-консоли на базе эмулятора RetroArch и дистрибутива Recallbox. Когда я попробовал поиграть на этом в свои любимые игры детства я был удивлен:»Как я мог в это играть? ». Физика игр казалась какой-то неправильной, ощущение отвратительное. Спустя время мне рассказали, что все дело в задержке ввода, которая на первый взгляд не ощущается как задержка, а именно как другая физика.

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

В чем проблема?


Задержка ввода — это время от момента нажатия кнопки на геймпаде до реакции персонажа на экране. Здесь играет роль сразу множество факторов:

  • Задержка монитора/телевизора — некоторые современные телевизоры имеют задержку вывода изображения более 100 мс. Это связано с постобработкой изображения, буферизацией, фильтрами и т.д. Здесь наглядно показано сравнение CRT и LCD телевизора с высокой задержкой. Обычно производители мониторов указывают в спецификациях скорость матрицы, имея в виду скорость переключения между цветами, но это не имеет отношения к задержке вывода изображения.

    Your browser does not support HTML5 video.

    Один аналоговый сигнал от приставки на двух телевизорах. Видна значительная задержка на LCD телевизоре по сравнению с CRT.
  • Задержка компьютера — игровая приставка или компьютер с эмулятором обрабатывают сигнал не моментально, на это тратится время. Компьютеру нужно принять сигнал от устройства ввода, обработать его и вывести изображение на экран. Задержку также вносит вертикальная синхронизация изображения при выводе на экран. Здесь разработчики RetroArch пытаются решить эту проблему.

    Your browser does not support HTML5 video.

    Демонстрация большой задержки на эмуляторе. Видео Denis Major
  • Задержка контроллера — устройство ввода тоже может вносить задержку. Например, если подключено к нагруженной шине USB, по Bluetooth и т.д.

Эмуляторы


Всем хочется играть на современном железе, нормальных телевизорах и мониторах с HDMI, а еще запускать все возможные игры на одном устройстве. Для этого используются эмуляторы популярных консолей, которые запускаются на обычных X86 или ARM компьютерах. Вот самые популярные из них:

Retroarch


adf7vq8geywlkccgt4cnj0herdi.png
Самый популярный и продвинутый эмулятор. Умеет эмулировать PlayStation1, SNES, NES, GameBoy, Sega Genesis/CD и другие консоли. Работает на десктопных ОС Windows, Linux, MacOS и на современных консолях Xbox, Adnroid, PlayStation2/¾/Vita, Nintendo Wii/Switch и других. На его основе сделан популярный дистрибутив Recallox.⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

OpenEMU


image
Очень удобный и простой эмулятор для macOS. Поддерживает большинство популярных консолей и имеет удобную галерею игр, отсортированную по платформам. Из коробки поддерживает геймпады от Playstation 4 по bluetooth. Он уступает по возможностям RetroArch, но на мой вкус намного более удобный в использовании. Для своих замеров я буду использовать его, так как он сразу работает на macOS без пердолинга с настройкой геймпада.⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

Методика измерений


Самый доступный способ измерения задержки — запись на видео экрана и момента нажатия на кнопку джойстика. Современные смартфоны легко снимают видео в 240 FPS и больше, что вполне достаточно для замеров. Чтобы точно зафиксировать момент нажатия, можно припаять светодиод к контактам кнопки, который будет загораться в момент нажатия. Светодиод загорается за наносекунды, что позволяет точно фиксировать момент нажатия.

Brunnis c форума проекта libretro провел большое исследование проблемы задержки ввода. Его исследования считаю наиболее полными и объективными.

image
USB геймпад с припаянным светодиодом для фиксирования момента нажатия кнопки

image
Кнопка не нажата

image
Кнопка нажата

image
Начало анимации на экране спустя 24 кадра (100 миллисекунд)

Формула расчета


В секунде 1000 миллисекунд.
Камера телефона снимает в 240fps.
Значит 1 кадр видео = 1000 / 240 = 4,16 мс.

Здесь также важно учитывать частоту кадров на которой работает монитор и компьютер. Например для режима работы 30fps, один кадр монитора будет равен 33 мс, а для 60fps — 17 мс. Это нужно учитывать, так как время между кадрами не может быть меньше этих значений, а значит события происходящие в промежуток обновления кадров на мониторе будут округляться до последнего кадра.

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

Главное что нужно запомнить: оригинальные консоли имели в среднем задержку от 50 до 70 мс, в зависимости от консоли и режима PAL/NTSC. Хорошо настроенный эмулятор на PC добавляет 60–80 мс задержки, в зависимости от эмулируемой платформы. Эмулятор на raspberry pi может в сумме иметь до 150 мс задержки.

Мои поиски


В детстве у меня была Sega Mega Drive, именно ее игры вызывают самую сильную ностальгию. Поэтому я буду описывать свои поиски комфортного сетапа именно для этой консоли. Сразу хочу сказать, что мое исследование не претендует на абсолютную точность измерений.

Мои требования:

  • Беспроводные геймпады — возможно меня осудят консольные гики, но я хочу комфортно играть сидя на диване в любой позе. Проводные геймпады это жутко неудобно, об них все задевают и долго так не поиграешь.
  • Вывод по HDMI или DisplayPort — на моем мониторе нет аналоговых входов, поэтому купить оригинальную Sega Mega Drive я не могу. USB-адаптеры для аналогового захвата видео вносят свою задержку и неудобны. Покупать отдельный CRT-телевизор для приставки тоже не хочется

Macbook + Dualshok 4 + OpenEMU


Мне очень нравится геймпад от Playstation 4, я считаю его самым удобным из существующих геймпадов. Он может работать как по bluetooth, так и по проводу USB. Полностью поддерживается в OpenEMU из коробки без настроек.

s7g6rmdkwbruucxf9awgobijvwm.jpeg

Несмотря на все удобство OpenEMU, его главная проблема это просадка FPS в полноэкранном режиме. Я не уверен в чем причина, и возможно это исправляется, но у меня не получилось. Поэтому я играю в оконном режиме.

uxkozuyamtmm9gs3r3xerz4li7g.png
Интерфейс эмулятора OpenEMU. Все игры отсортированы по платформам.

Замеры


Я не хотел раскурочивать геймпад от Playstation чтобы припаять светодиод, поэтому отсчет момента нажатия кнопки пришлось делать по звуку. Погрешность такого способа примерно 8–10 мс. Монитор использую LG 24UD58 в режиме 4K@60fps подключенный к макбуку через DisplayPort. Игра Contra Hard Corps.

Your browser does not support HTML5 video.


Задержка на макбуке с контроллером Dualshock4, подключенным по bluetooth равна примерно 150 мс. Это много!

Макбук + Dulashock дает примерно 150 мс задержки. Это достаточно много для комфортной игры, такая задержка заметно ощущается и в хардкорные платформеры вроде Contra Hard Corps играть некомфортно.

Несмотря на то, что задержка такой связки непростительно большая, она все равно заслуживает право на жизнь. Так как достаточно кинуть в рюзкак к ноутбуку геймпад, и получить в любом месте игровую консоль. Еще до замеров мне было понятно, что это не лучший вариант и я продолжил поиски.

Клон Sega Genesis


Сейчас продается много разных пиратских клонов ретро-консолей с предустановленными играми. Некоторые из них сделаны из телевизионных приставок на Android с эмуляторами консолей внутри, а значит страдают теми же проблемами с задержками. Но некоторые обещают полноценную консоль без эмулятора. Я нашел на авито за косарь вот такую консоль: retrogenesis.ru модель Retro Genesis HD Ultra. На сайте пишут, что это не эмулятор, а внутри действительно аппаратная консоль. Есть предустановленные игры и возможность вставлять картриджи. При этом есть HDMI выход и беспроводные геймпады!

lrqtditg47ealm_6rpgdrwiwdi0.jpeg

Беспроводные геймпады


Больше всего меня напрягали геймпады, работающие на частоте 2.4GHz. Зная проблемы bluetooth и WiFi на этом диапазоне, я первым делом попробовал измерять задержку самих геймпадов. Консоль поддерживает одновременное подключение проводных и беспроводных геймпадов. Оказалось, что беспроводная часть сделана с помощью отдельного модуля, который замыкает контакты так же, как проводной геймпад. То есть по сути эмулирует обычный проводной, с такой же распиновкой.

image
Радиомодуль, который эмулирует нажатия проводного геймпада

Я подключил щуп 1 осциллографа к светодиоду на геймпаде, а другой к контакту, соответствующему клавише Up на консоле. Когда сигнал будет обработан радиомодулем, он сэмулирует нажатие клавиши, и я увижу это на щупе 2. Сравнив разницу во времени между сигналами 1 и 2, я смог очень точно получить задержку, которую добавляет беспроводной геймпад. На осциллографе масштаб одной клетки 5 мс, значит задержка беспроводных геймпадов 25 мс.

Your browser does not support HTML5 video.


Сравнение сигналов на геймпаде и консоли

sqh2pvcjqjqjpe2iyzekknzhjwu.jpeg
Беспроводной модуль добавляет 25 мс задержки

Замеры


Your browser does not support HTML5 video.


Задержка на Sega Retro Genesis примерно 70 мс

За вычетом 25 мс задержки радимодуля получается, что сама консоль имеет задержку 50 мс, что соответствует оригинальной Sega. При подключении проводных геймпадов, задержка, очевидно, будет меньше на 25 мс. В целом геймплей ощущается как на оригинальной приставке, и я доволен. Огорчает только невозможность загружать свои игры (ROM-ы), но я попробую решить эту проблему с помощью перезаписываемого картриджа, либо попытаюсь найти возможность заливать на встроенную флешку игры самостоятельно.

Заключение


Мои замеры не учитывают задержку вывода монитора, но все измерения сделаны на одном и том же мониторе, поэтому она не влияет на результаты. Каждый замер я повторил 10 раз, получая иногда разброс в показаниях около 4 кадров, то есть 16 мс. Полагаю, что дело в задержке вертикальной синхронизации при формировании изображения на консоли.
В целом, считаю, что мои измерения дают общие представления о задержках на двух сетапах и, возможно, будут полезны тем, кто выбирает себе способ.

Опция runahead на RetroArch


Год назад разработчики RetroArch заявили, что добились на своем эмуляторе задержек меньше чем на оригинальных консолях. Я сам не пробовал эту опцию, но ее нужно иметь в виду.

Ссылки


Спасибо Denis Major за его исследования. Благодаря этому видео я впервые узнал, что проблема не в измененной физике игр, а именно в задержках ввода.

Большое исследование задержек на разных платформах forums.libretro.com/t/an-input-lag-investigation/4407

Еще одно исследование medium.com/@WydD/controller-input-lag-how-to-measure-it-1ebfd2c9d60

Про Хакспейс Нейрон


iydb3e861_8a1ff-q0twqxspwx8.png
В нашем Хакспейсе Нейрон мы регулярно играем в ретро-приставки, реверсим железо и делаем много других штук. У нас вы сможете воспользоваться паяльником, осциллографом, частотным анализатором и пообщаться с веселыми задротами. Приходите в гости.

Все новости о жизни Хакспейса в телеграм-канале: @neuron_news

© Habrahabr.ru