В редакции регулярно всплывают послания читателей: курсор в Quake II плывёт, в Diablo дрожит, в Fallout 1 еле ползёт. Беру тестовый стенд, разворачиваю весь диапазон платформ — от Pentium MMX до Ryzen — и фиксирую три категории аномалий: медленный дрейф, гиперскорость, синусоидальный росчерк.
Исток первой проблемы кроется в старом таймере 18,2 Гц. Кодеры DOS-эпохи приравнивали один тик к одной позиции мыши. На CPU 3 GHz тик превращается в вспышку: игра успевает обработать лишь каждую сотую выборку. На экране возникает ощущение болотной трясины.
Гиперскорость прорастает из функции GetCursorPos() внутри ранних Win32-проектов. API цепляет современный 1000-Гц-датчик, умножает на устаревший коэффициент ускорения — курсор запрыгивает в угол за пол-пикселя.
Волнообразие рождается при двойном преобразовании: аппаратный фильтр сглаживает движение, сверху надстраивается DirectInput с собственной аппроксимацией. Интерференция двух алгоритмов выводит траекторию на синус.
Два лагеря игроков
Старовер-пурист жаждет аутентичности и ставить оригинальный драйвер Logitech 1997 года, смиряясь с COM-портом 1200 под. Музейный подход, но он исключает перекликающиеся фильтры.
Модернист собирает гибрид: критическая игра запускается внутри виртуального контейнера, входные события захватывает Raw-Input-обёртка, частота опроса снижается до 125 Гц через hidusbf.
Побочный эффект — фантомные двойные клики. Их лечу правкой дебаунс-периода в реестре HKLM\SYSTEM\CurrentControlSet\Services\mouclass\Parameters. Значение MouseDataQueueSize = 128 нивелирует коллизии.
Ловушка аппроксимации
Часто спрашивают, зачем вообще трогать таймер, если существует вертикальная синхронизация. Отвечаю: VSync гасит разрывы кадра, но не затрагивает путь HID-пакета. Чем сильнее десинхрон, тем ярче алиасинг движения.
Добавляю в арсенал каподастр — WinThrottle. Утилита принудительно снижает частоту CPU до заданного процента. Древняя игра возвращается к доминанте 50 FPS, курсор ведёт себя корректно без инжекции dll.
Точки росчерка
Для волнообразного режима испробовал экзотический способ: вставляю в цепочку виртуальный эхолот, предоставленный проектом Interception. Драйвер фиксирует сырые данные, пропускает их через забытый фильтр Калмара — высокочастотный гистерезис, устраняющий колебания ниже 3 мкм. — линия ровная как штрих ЭКГ спортсмена.
Гиперскорость укрощается парой строк в файле ddraw.ini: заявляю fixedtimesteplength = 15 и sensitivity = 0.5. В DirectDraw-проектах патч DDrawCompat подменяет внутренний хендлер мыши, опираясь на хронотоп кадра, а не на реальное время.
После испытаний пятидесяти релизов и семи мышей прихожу к простому своду действий: синхронизируем таймер, контролируем частоту опроса, устраняем лишние фильтры. Любая древняя аркада реагирует благодарностью — курсор следует интуиции игрока, а не прихоти алгоритмов.