Назад к блогу

Marathon Input Issues Fix: Архитектура PC-игр в условиях конфликтов с Overlay

Опубликовано 28 февраля 2026 г.
Marathon Input Issues Fix: Архитектура PC-игр в условиях конфликтов с Overlay

Каждый разработчик соревновательных мультиплеерных игр знает это чувство, когда идеально выстроенный netcode ломается из-за оверлея Discord. Вы месяцами оптимизируете серверную инфраструктуру для задержки менее 30 мс, но игроки промахиваются, потому что фоновое приложение для стриминга душит поток ввода (input thread).

Этот сценарий сейчас наблюдается в Server Slam шутера Marathon от Bungie. Игроки жалуются на mouse lag и пропуски ввода. Bungie официально подтвердила проблему, указав на сторонние утилиты и оверлеи.

Игроки ищут marathon input issues fix. Временное решение: стримить весь экран вместо окна игры и отключить оверлеи.

Для разработчиков вопрос в архитектуре: почему оверлеи перехватывают ввод и как это предотвратить?

В этом разборе мы изучим обработку ввода в Windows, проблемы frame pacing в OBS и декуплинг потоков ввода.

Причина: Как оверлеи перехватывают Render Pipeline

Приложения вроде OBS внедряют DLL в процесс игры и перехватывают вызовы графического API, например функцию Present в DirectX.

Бутылочное горлышко Swap Chain

Перехват swap chain заставляет движок ждать копирования frame buffer. Кадр, который должен занимать 16.6ms, внезапно занимает 24ms. Так как движки опрашивают WM_MOUSEMOVE в основном потоке перед рендером, задержка рендера задерживает опрос ввода.

Решение: Raw Input API

Используйте Raw Input API (WM_INPUT) в отдельном высокоприоритетном потоке, полностью отделенном от render loop.

Реализация Raw Input на C++ (Win32)

void InitializeRawInput(HWND hwnd) {
    RAWINPUTDEVICE Rid[1];
    Rid[0].usUsagePage = 0x01; 
    Rid[0].usUsage = 0x02; 
    Rid[0].dwFlags = 0;   
    Rid[0].hwndTarget = hwnd;
    RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
}

Unreal Engine: Отключение Smoothing

Отключите mouse smoothing в PlayerController, чтобы избежать лагов при колебаниях FPS.

Client Lag и Server Rollback

Задержка ввода на клиенте приводит к поздней отправке пакетов. Серверу приходится форсировать симуляцию, что вызывает rubberbanding, как описано в How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer.

Используя horizOn, вы получаете серверы с защитой от десинхронизации.

5 правил надежного ввода

  1. Отделите ввод от рендеринга.
  2. Используйте DXGI Flip Model.
  3. Используйте Hardware Cursor.
  4. Предупреждайте об инъекциях DLL.
  5. Используйте Fixed Timestep Simulation.

Заключение

Внедряйте Raw Input и декуплинг потоков. Для бэкенда используйте horizOn, чтобы не тратить время на борьбу с десинхронизацией.