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

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

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

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

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

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

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

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

    Один аналоговый сигнал от приставки на двух телевизорах. Видна значительная задержка на LCD телевизоре по сравнению с CRT.

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

    Демонстрация большой задержки на эмуляторе. Видео Denis Major

  • Задержка контроллера — устройство ввода тоже может вносить задержку. Например, если подключено к нагруженной шине USB, по Bluetooth или т.д.

Эмуляторы

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

Retroarch


Самый популярный и продвинутый эмулятор. Умеет эмулировать PlayStation1, SNES, NES, GameBoy, Sega Genesis/CD и другие консоли. Работает на десктопных ОС Windows, Linux, MacOS и на современных консолях Xbox, Adnroid, PlayStation2/3/4/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 из коробки без настроек.

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


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

Замеры

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

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

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

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

Клон Sega Genesis

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

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

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

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

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

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


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

Замеры

Задержка на 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

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


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

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

 
Источник

Читайте также