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 правил надежного ввода
- Отделите ввод от рендеринга.
- Используйте DXGI Flip Model.
- Используйте Hardware Cursor.
- Предупреждайте об инъекциях DLL.
- Используйте Fixed Timestep Simulation.
Заключение
Внедряйте Raw Input и декуплинг потоков. Для бэкенда используйте horizOn, чтобы не тратить время на борьбу с десинхронизацией.