Как мы измеряем задержку кнопки мыши: описание программно-аппаратного комплекса

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

Среди обозревателей игровой периферии самым, пожалуй, распространенным способом измерения задержки нажатия на кнопку мыши является методика, включающая использование комплекса Latency and Display Analysis Tool (LDAT) компании Nvidia. Момент нажатия на кнопку определяется по фактическому замыканию контактов микропереключателя мыши (что требует разборки мыши и подпаивания проводков к выводам микропереключателя) или по звуку щелчка, который раздается при нажатии на кнопку мыши (нужно подключать микрофон). Момент окончания определяется по изменению яркости на участке экрана, например от вспышки выполненного в игре выстрела. Отрицательных моментов у такой методики как минимум два. Во-первых, нужен 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 Н, чего с учетом набранной во время движения кинетической энергии хватало для срабатывания кнопок всех протестированных мышей. Видео ниже демонстрирует работу стенда в случае цикла из 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 мс, что может быть обусловлено более коротким ходом как самого микропереключателя, так и лепестка корпуса, на котором лежит палец пользователя.

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

  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 означает использование радиочастотного интерфейса с подключением к штатному приемнику; приведена минимальная средняя задержка среди протестированных вариантов настроек мыши).

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

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

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

Выводы

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

Полный текст статьи читайте на iXBT