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



    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, Android, 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 за его исследования. Благодаря этому видео я впервые узнал, что проблема не в измененной физике игр, а именно в задержках ввода.

    Большое исследование задержек на разных платформах.

    Еще одно исследование.

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



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

    Все новости о жизни Хакспейса в телеграм-канале: @neuron_news
    Хакспейс Neuron
    79,97
    Компания
    Поддержать автора
    Поделиться публикацией

    Комментарии 18

      +6
      На телевизорах Samsung (старых, по крайней мере) улучшайзеры можно отключить, установив значение «ПК» в настройке имени(!) HDMI-входа. Эта настройка убирает motion prediction, отключает overscan, и положительно влияет на задержку.

      У некоторых компьютерных мониторов достаточно медленный скейлер. Например, на Dell P2415Q лучше устанавливать родное разрешение 3840×2160, иначе будет задержка в 2 кадра.
        +1
        На лыжах достаточно выбрать «Игры» в настройках режима экрана для соответствующего входа. Для моей модели (не самой дорогой и новой) гугление выдает задержку 14.9 мс.
          0
          Я так и сделал на мониторе для тестов. Правда разницу между этим режимом и обычным не измерял.
          +1
          Вау, неожиданная фича, не знал что имя входа может влиять :) Хорошо что во многих новых телевизорах уже есть «Game mode» из коробки. Вот кстати интересная сравнительная таблица с включенными «улучшайзерами» и без: Input Lag Datenbank mit Messergebnissen (DE)
          +1
          Недавно приобрёл Mister FPGA и запустил на нём Genesis core с подключённым проводным USB джойстиком (Sega Genesis USB controller с амазона) абсолютно никаких задержек и чёткая плавная картинка на LCD экране через HDMI. На Raspberry Pi 3b+ c RetroPie я чуствовал небольшую задержку и поэтому играть было не так кофмортно, особенно в Battletoads. Я думаю будущее ретро консоль гейминга за FPGA платами.
            0
            Я думаю будущее ретро консоль гейминга за FPGA платами.
            Это уже давно настоящее. Самые точные реплики аппаратной части популярных консолей Nt Mini, Super Nt и Mega Sg от Analogue построены на FPGA.
              +1
              Засматривался на их консоли, выглядит очень круто. Но 200$ жалко за это.
            0
            Интересно было почитать. Я не ощущал никакой разницы в физике и задержек. Подрубил свои F-710 logitech и перепрошли марио на денди и рок-н-ролл рейсинг на сеге без проблем. На эмулях.

            Вот что Не получилось, это поиграть по сети через инет. Пробовали танчики. Я видел одно, а коллега видел другое и спрашивал, куда я поехал, куда стреляю, и зачем =)
              +2
              У китайских Андроид-смартфонов только лаг ввода с тачскрина порядка 100-120 мс (легко померять, запустив любое приложение, которое воспроизводит звук при нажатии, или включив отображение прикосновений на экране и водя по кругу пальцем). На них вообще, видимо, играть не получится.
                0
                Вы наверно имеете в виду совсем бюджетный сегмент, где тач обрабатывает МТК а не отдельная микросхема.
                +1

                так вот как можно поиграть на Mac! ясно, понятно.

                  0
                  А как же классическое?
                  image
                    0

                    ну такой милый трюк не пройдет с макмини.


                    (И еще картинка со скамейкой из 2 макпро.
                    сидя на ней можно поиграть в какую-нибудь настольную игру.)

                  0
                  Странно почему автор не рассмотрел возможность прямого подключения к GPIO
                    0
                    к GPIO чего именно?
                    +1
                    Обратная сторона медали. Но это уже мало относится к теме статьи.
                      0
                      Говорят, в видео от Denis Major не включен runahead(?), поэтому такие лаги на Raspberry Pi 3.
                        0
                        Немного корректности использования русского языка автору в напутствие: "...не ощущается не как задержка, а именно как другая физика...".
                        Также, во избежание терминологической путаницы с «input lag монитора», рекомендую далее в материалах использовать термин «control lag», используемый внутри НВидиа (по той же причине) для обозначений этой же проблемы уже многие годы. ;)

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое