Marathon Input Issues Fix: Architektura gier PC a konflikty z Overlay
Każdy deweloper gier multiplayer zna to uczucie, gdy idealnie zaprojektowany netcode sypie się przez nakładkę Discorda. Miesiącami optymalizujesz infrastrukturę serwerową pod opóźnienia poniżej 30ms, by odkryć, że gracze nie trafiają w cel, bo aplikacja do streamingu dławi wątek inputu.
Ten scenariusz ma miejsce podczas Server Slam gry Marathon od Bungie. Gracze zgłaszają mouse lag i gubienie inputu. Bungie wskazuje na aplikacje trzecie i overlaye jako główną przyczynę.
Gracze szukają marathon input issues fix. Tymczasowe rozwiązanie: streamowanie całego ekranu zamiast okna gry i wyłączenie nakładek.
Deweloperzy muszą jednak zadać pytanie: jak projektować klienty PC, by zapobiegać przejmowaniu inputu?
W tym artykule przeanalizujemy obsługę inputu w Windows, problemy z frame pacing w OBS i desynchronizację wątków.
Przyczyna: Jak Overlaye przejmują Render Pipeline
Aplikacje takie jak OBS wstrzykują DLL do procesu gry, przechwytując wywołania API graficznego, np. funkcję Present w DirectX.
Wąskie gardło Swap Chain
Przechwycenie swap chain zmusza silnik do czekania na skopiowanie frame buffera. Klatka trwająca 16.6ms nagle zajmuje 24ms. Ponieważ silniki sprawdzają WM_MOUSEMOVE na głównym wątku przed renderowaniem, opóźnienie renderu opóźnia polling inputu.
Rozwiązanie: Raw Input API
Należy porzucić standardowe komunikaty Windows na rzecz Raw Input API (WM_INPUT) i przenieść polling do osobnego wątku o wysokim priorytecie.
Implementacja Raw Input w 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: Wyłączenie Smoothing
W Unreal Engine należy wyłączyć mouse smoothing w PlayerController, by uniknąć lagów przy wahaniach FPS.
Client Lag a Server Rollback
Opóźnienie inputu na kliencie powoduje późne wysyłanie pakietów. Serwer musi wtedy stosować reconciliation, co prowadzi do rubberbandingu, podobnie jak w How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer.
Używając horizOn, możesz wdrożyć serwery z wbudowaną ochroną przed desynchronizacją.
5 Zasad odpornego Inputu
- Oddziel Input od Renderowania.
- Wymuś DXGI Flip Model.
- Używaj Hardware Cursor.
- Ostrzegaj przed Hook Injections.
- Stosuj Fixed Timestep Simulation.
Podsumowanie
Deweloperzy muszą stosować Raw Input i oddzielne wątki. Dla backendu wybierz horizOn, by uniknąć problemów z synchronizacją.