Как мы измеряем задержку кнопки мыши

Обзор существующих методик

Вряд ли можно поспорить с утверждением, что чем меньше задержка от нажатия на кнопку мыши до выполненного в игре действия (выстрела, например), тем при прочих равных условиях будет выше результативность в играх, особенно в очень динамичных играх. Определить эту задержку, основываясь на субъективных ощущениях, в лучшем случае можно лишь качественно, что затрудняет объективное сравнение игровых манипуляторов типа «мышь».

Среди обозревателей игровой периферии, пожалуй, самым распространенным способом измерения задержки нажатия на кнопку мыши является методика, включающая использование комплекса Latency and Display Analysis Tool (LDAT) компании Nvidia. Комплект состоит из слегка доработанной (об этом ниже) мышки Logitech G203 Prodigy, собственно датчика LDAT и кабеля USB 2.0 с вилками типа A и Micro.

Сверху на датчике есть сигнальный светодиод и разъем для подключения кабеля от микропереключателя мыши. Снизу – окошко, за которым находится оптический датчик. С одного торца – разъем Micro-USB, с другого – микрофонный разъем миниджек 3,5 мм.

Момент нажатия на кнопку определяется по фактическому замыканию контактов микропереключателя мыши (что требует разборки мыши и подпаивания проводков к выводам микропереключателя; мышь из комплекта уже таким образом модифицирована) или по звуку щелчка, который раздается при нажатии на кнопку мыши (нужно подключать микрофон). Момент окончания определяется по изменению яркости на участке экрана, например от вспышки выполненного в игре выстрела. На экране датчик закрепляется с помощью эластичного шнура.

Nvidia предлагает специальную программу для обработки данных с датчика, так же ее можно использовать для тестов вместо игр – большой участок окна меняет яркость, имитирую вспышку от выстрела. Также в ней есть автоматический режим, в котором контакты кнопки мыши замыкаются самим датчиком LDAT с указанной периодичностью.

Отрицательных моментов у такой методики как минимум два. Во-первых, нужен LDAT. Во-вторых, таким способом определяется полная задержка, вклад в которую вносят слишком много программных и аппаратных стадий обработки и передачи сигнала. Второе затрудняет определение вклада именно мыши и осложняет сравнение результатов, полученных в различных условиях — например, при использовании разных мониторов и версий графических драйверов (или их настроек).

Мы провели тесты с тремя мышками, используя игровой монитор MSI Oculux NXG253R, главной особенностью которого является очень высокая частота обновления (360 Гц) и низкая задержка вывода (согласно нашим данным она равна 2,7 мс). С помощью LDAT мы определили среднее значение полной задержки, и вычли из нее задержку вывода монитора. Результаты представлены в крайней правой колонке с заголовком «LDAT: задержка, мс (Delay, ms)» в таблице ниже и на диаграмме. 

Модель (Model) Задержка, мс (Delay, ms) LDAT: задержка, мс (Delay, ms)
Corsair Katar Pro 5.5 10.1
Logitech G203 Prodigy 7.2 11.9
Sven GX-950 33.9 38.1

Во второй колонке с заголовком «Задержка, мс (Delay, ms)» и также на диаграмме приведены результаты, полученные на нашем стенде второй версии – см. ниже. Видно, что разница между задержками, определенными двумя способами составляет от 4,2 до 4,7 мс. Это значение общей системной задержки, за вычетом задержки мыши и монитора. Получается, что с помощью LDAT можно с достаточно высокой точностью сравнивать мышки между собой, если проводить тесты в одинаковых условиях. Однако это не показательно, так как общая системная задержка довольно высокая в сравнении с величиной задержки мыши в случае быстрых манипуляторов. К тому же, при любом изменении в системе, даже после установки новых драйверов, нужно проводить повторные тесты, и по необходимости, выполнять корректировку результатов.

Отметим, что в случае новой версии датчика LDAT, судя по всему, можно определять задержку именно мыши, видимо, не по вспышке на экране, а по приходу системного сообщения. Однако перспективы на то, что этот датчик у нас появится, не очень оптимистичные. Забегая вперед, укажем, что принцип работы такого нового датчика LDAT в точности такой же, что и у первой версии нашего стенда – см. ниже.

Есть и еще один вариант: команда из rtings.com использует звук щелчка кнопки в качестве начала измерения, а конец определяется также по регистрации события, а не по вспышке на экране.

Таким образом, для определения задержки именно нажатия на кнопку мыши, начало события определяется по замыканию контактов мыши (регистрируется или собственно замыкание при нажатии на кнопку или момент замыкания с помощью вынесенного контроллера) или по звуку щелчка кнопки, а окончание – по приходу системного сообщения.

Первый вариант стенда

Разрабатывая свою методику измерения задержки кнопки мыши, от использования микрофона мы решили отказаться. На первой итерации мы также отказались от механического замыкания контактов микропереключателя — пусть выводы замыкает управляющий контроллер. В качестве последнего мы использовали то, что оказалось под рукой, а именно модуль Seeeduino Xiao, основанный на микроконтроллере SAMD21G18, выпускаемом теперь уже компанией Microchip.

Соответствие выводов модуля выводам микроконтроллера (далее отсылка будет именно к ним) показывает фрагмент схемы модуля, приведенный ниже:

Подопытной мышью стала Sven GX-950 Gaming. Мы ее разобрали:

И подпаяли два проводка к контактам микропереключателя левой кнопки:

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

И собранный модуль:

Плюс и минус на выводах микропереключателя легко определить с помощью мультиметра на подключенной мыши, а в данном случае контакт «минус» был еще и нулевым.

Измерение задержки в этом случае происходит следующим образом:

  1. Программа на ПК по USB передает на модуль Seeeduino Xiao команду нажать на кнопку мыши.
  2. Модуль Seeeduino Xiao через модуль с фототранзистором замыкает кнопку мыши и запускает таймер отсчета задержки.
  3. Во время опроса по USB мышь на ПК передает событие нажатия на кнопку, которое системой предается в программу как сообщение WM_LButtonDown (или WM_LButtonDblclk).
  4. Программа, приняв эти сообщения, по USB передает на модуль Seeeduino Xiao команду завершения измерения задержки.
  5. Модуль Seeeduino Xiao останавливает таймер отсчета задержки и передает в программу на ПК значение таймера, которое программой пересчитывается в миллисекунды.

В случае нашей подопытной мыши Sven GX-950 Gaming среднее для 100 измерений значение задержки составило 28,7 мс, минимальное — 24,1 мс и максимальное — 33,9 мс. Это для стандартной частоты опроса 125 Гц.

Второй вариант стенда

Однако нам показалось, что каждый раз разбирать мышь и подпаивать проводки — слишком затратно, так что этот этап мы решили исключить. Без разбора мыши (и без использования микрофона) остается единственный вариант — нажать на ее кнопку штатным образом, но сделав это по команде с минимальной задержкой. Человеку такую функцию доверить нельзя, поэтому на помощь приходит механизированный палец. Одним из самых быстрых и доступных приводов, подходящих для выполнения такой задачи, является привод головок жесткого диска. На его основе и был изготовлен стенд с механизированным пальцем:

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

Упор из стального уголка и наклеенные резиновые полоски удерживают мышь и не дают ей сдвинуться по время серии нажатий на кнопку. Стенд с мышью Sven GX-950 Gaming:

И в случае мыши поменьше, A4Tech G7-630:

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

Основание также приобрело резиновые ножки, в качестве которых были использованы пробки от флаконов:

Общий вид обновленного стенда:

Роботизированный палец под собственным весом опускается вниз до контакта с кнопкой мыши, что фактически соответствует положению расслабленного пальца пользователя. Для нажатия достаточно подать на катушку привода импульс тока нужной полярности, а в отсутствие тока «палец» сам вернется в исходное положение. Это позволило обойтись простейшим приводом с одним транзистором. Его схема:

И реализация:

Обратная сторона:

Поскольку долговременная подача напряжения 12 В сильно разогревает катушку привода, то максимальная длительность импульса программно была ограничена интервалом в 250 мс, но при штатной работе напряжение на привод подается не дольше, чем на несколько миллисекунд. Максимальное усилие нажатия на кнопку мыши до срабатывания микропереключателя, среди тех мышей, что оказались у нас в доступе, варьировалось от 0,6 до 0,9 Н. Статическое усилие, развиваемое пальцем стенда, было на уровне 0,75 Н, чего с учетом набранной во время движения кинетической энергии хватало для срабатывания кнопок всех протестированных мышей.

Общая схема соединений всех блоков приведена ниже (источник питания 12 В для драйвера (Driver) не показан):

Подключение к контактам микропереключателя мыши в данном случае является необязательным, и используется только в том случае, если нужно определять задержку от передачи сигнала приводу (HDD Head) до замыкания контактов микропереключателя.

Видео ниже демонстрирует работу стенда в случае цикла из 10 нажатий.

С механическим пальцем и в случае мыши Sven GX-950 Gaming (она показана на видео) среднее для 100 измерений значение задержки составило уже 33,8 мс, минимальное — 28,4 мс, а максимальное — 39,3 мс. Задержка увеличилась, так как требуется дополнительное время на срабатывание привода и выбор свободного хода кнопки мыши. Впрочем, с нашей точки зрения, это лучше отражает реальную ситуацию, так как палец пользователя обычно свободно лежит на кнопке мыши, а не продавливает ее заранее почти до момента срабатывания. Подпаянные проводки позволили все так же с помощью Seeeduino Xiao определить задержку от передачи сигнала приводу до замыкания контактов микропереключателя. В случае мыши Sven GX-950 Gaming эта задержка составила порядка 4,5 мс, а, забегая вперед, в случае мыши с очень низкой задержкой (Corsair Katar Pro) эта задержка меньше, порядка 3,75 мс (в случае Logitech G203 Prodigy еще меньше – 3,2 мс), что может быть обусловлено более коротким ходом как самого микропереключателя, так и лепестка корпуса, на котором лежит палец пользователя.

Алгоритм измерения задержки в варианте с механическим пальцем такой:

  1. Программа на ПК по USB передает на модуль Seeeduino Xiao команду нажать на кнопку мыши.
  2. Модуль Seeeduino Xiao через модуль драйвера подает напряжение на катушку привода и запускает таймер отсчета задержки.
  3. Опционально (если к кнопке подпаяны проводки): в момент замыкания контактов кнопки запоминается значение таймера.
  4. Во время опроса по USB мышь передает на ПК событие нажатия на кнопку, которое системой предается в программу как сообщение WM_LButtonDown (или WM_LButtonDblclk).
  5. Программа, приняв эти сообщения, по USB передает на модуль Seeeduino Xiao команду завершения измерения задержки.
  6. Модуль Seeeduino Xiao останавливает таймер отсчета задержки и передает в программу на ПК значение таймера, которое программой пересчитывается в миллисекунды. Опционально также передается первое запомненное значение таймера, которое пересчитывается в миллисекунды.

Окно управляющей программы после завершения измерения обеих задержек:

Порядок выполнения измерения следующий:

  1. Выполняются все подготовительные работы: установка мыши на стенд, выбор параметров работы мыши, подключение модуля Seeeduino Xiao по USB и питания 12 В к драйверу, запуск программы и т. д.
  2. В программе выбирается число тестов (обычно 100), задержка между тестами (500 мс достаточно, чтобы механический палец успокоился на кнопке мыши после нажатия и отпускания) и нужно ли выполнять измерение первой задержки.
  3. Курсор мыши ставится на бледно-желтое поле (хотя можно и на любое пустое место окна) и с помощью клавиатуры нажимается кнопка «Start!».
  4. По окончании цикла измерений в окне Delays выводятся среднее, минимальное и максимальное значение для одной или обеих задержек, а также список самих задержек (первая выводится справа).

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

Предварительные результаты

Для апробации работы стенда мы протестировали несколько мышек, оказавшихся в ближайшем доступе. Результаты представлены ниже (RF означает использование радиочастотного интерфейса с подключением к штатному приемнику; приведена минимальная средняя задержка среди протестированных вариантов настроек мыши).

Модель (Model) Задержка, мс (Delay, ms)
Corsair Dark Core RGB Pro 5.2
Corsair Katar Pro 5.5
Corsair Dark Core RGB Pro (RF) 6
Razer DeathAdder V2 X HyperSpeed (RF) 7.2
Logitech G203 Prodigy 7.2
Corsair Scimitar RGB Elite 9.9
Corsair Glaive RGB 10
SteelSeries Aerox 3 Wireless (RF) 12.4
MSI Clutch GM50 18.3
Oklick GMNG 980GMW 18.5
Oklick GMNG 980GMW (RF) 18.7
Asus ROG Strix Carry 18.8
MSI Clutch GM20 Elite 19.9
A4Tech G7-630N (RF) 27.9
A4Tech G7-630 (RF) 28.7
Sven GX-950 33.9
HP 3NZ71AA (RF) 48.2
Oklick 990MW 52.9

Эти мыши по величине задержки условно можно разделить на четыре группы: очень быстрые (порядка 6 мс), быстрые (около 10 мс), средние (менее 20 мс) и небыстрые (выше 25 мс). Насколько в реальной игре скажется, допустим, различие между этими группами, предугадать сложно, но для очень динамичных игр при высокой частоте кадров хочется рекомендовать мыши только из первой и второй групп, то есть с задержкой (определенной нашим методом) не более 10 мс.

В случае игровых мышек, как правило, в настройках можно выбрать повышенную частоту опроса, в нашем случае до 2000 Гц. Посмотрим на примере трех мышек Corsair, как на задержку влияет частота опроса:

Видно, что разница между 2000 и 1000 Гц практически отсутствует. Между 1000 и 500 Гц разница уже скорее есть, чем нет. Между 500, 250 и 125 Гц разница существенная. Но в любом случае для очень быстрых мышек даже в случае минимальной частоты опроса 125 Гц задержка все равно очень низкая. Примечательно, что радиочастотный интерфейс в данном случае увеличил задержку совсем незначительно.

Рассуждения на тему частоты опроса 2000 Гц и выше

Как нам подсказали в комментариях к первой версии этой статьи, в случае USB-устройств Full-Speed (а все мышки из списка выше именно такие) частота опроса не может превышать 1000 Гц. При якобы частоте в 2000 Гц опрос реально происходит с частотой 1000 Гц, но в пакете передается два набора координат (и, видимо, состояний кнопок). Драйвер мыши обрабатывает этот пакет и выдает в систему два набора сообщений с небольшим интервалом. В теории не исключен вариант, что второй набор получается путем экстраполяции, а не из фактических данных. Собственно поэтому разницы в задержке между 2000 и 1000 Гц нет.

Программа MouseTester позволяет выявить описанный случай с двумя наборами в одном пакете. Для этого нужно построить зависимость интервала обновления от времени. Покажем это на примере мышки Corsair Dark Core RGB Pro. Сначала график для частоты опроса 500 Гц:

 Видно, что сообщения приходят через 2 мс с очень небольшим разбросом. Теперь для 1000 Гц:

Разброс также незначительный. И для 2000 Гц:

В данном случае есть повторяющееся отклонение через одно обновление координат в большую и меньшую сторону от 0,5 мс. Это доказывает, что пакеты приходят через 1 мс, а драйвер выдает одно обновление координат, например, сразу, а второе через промежуток больший или меньший 0,5 мс

Выводы

В случае очень динамичных игр и при высокой частоте обновления картинки на результат с большой вероятностью будет существенно влиять то, сколько времени пройдет от щелчка по кнопке мыши до совершенного выстрела. Разработанный нами программно-аппаратный комплекс позволяет измерять задержку от нажатия на кнопку мыши до прихода системного сообщения в программу. Предварительные результаты показали, что игровые мышки могут иметь задержку кнопки порядка 5 мс, тогда как обычные — несколько десятков миллисекунд.

6 марта 2022 Г.