Marathon Input Issues Fix: PC Oyunlarını Overlay Çatışmalarından Korumak İçin Mimari Çözümler
Her rekabetçi multiplayer geliştiricisi, kusursuz tasarlanmış bir netcode'un Discord overlay yüzünden çökmesinin verdiği o kötü hissi bilir. Sunucu altyapınızı 30ms altı gecikme için optimize etmekle aylar harcarsınız, ancak bir bakarsınız ki arka plandaki bir streaming uygulaması oyunun input thread'ini boğduğu için oyuncular atışlarını kaçırıyor.
Bu senaryo şu anda Bungie'nin yeni extraction shooter oyunu Marathon'un Server Slam testinde yaşanıyor. PC oyuncuları ciddi mouse lag ve input kaybı bildiriyor. Bungie, sorunu resmi olarak kabul ederek üçüncü taraf araçları ve streamer overlay'lerini ana suçlu olarak gösterdi.
Topluluk forumlarında binlerce oyuncu bir marathon input issues fix arıyor. Geçici çözüm ise basit: Pencere yakalama yerine tüm ekranı yansıtmak ve overlay'leri kapatmak.
Ancak geliştiriciler için bu durum mimari bir soruyu doğuruyor: Streaming uygulamaları neden input'ları ele geçiriyor ve PC istemcilerimizi bunu önleyecek şekilde nasıl tasarlayabiliriz?
Bu teknik incelemede, Windows input işleme mekanizmalarını analiz edecek, OBS'in neden frame pacing sorunlarına yol açtığını inceleyecek ve input thread'lerini nasıl ayıracağımızı göstereceğiz.
Temel Sebep: Overlay'ler Render Pipeline'ı Nasıl Ele Geçirir?
OBS veya Discord gibi uygulamalar, oyun sürecine bir DLL enjekte eder. Bu DLL, DirectX'teki Present veya Vulkan'daki vkQueuePresentKHR fonksiyonlarını hook'layarak grafik API çağrılarını keser.
Swap Chain Darboğazı
Overlay, swap chain'i hook'layarak motoru beklemeye zorlar. 16.6ms sürmesi gereken bir kare aniden 24ms sürer. Çoğu motor WM_MOUSEMOVE verisini ana thread üzerinde render tick'inden hemen önce topladığı için, render'ın gecikmesi input polling'i de geciktirir.
Çözüm: Raw Input API
Rekabetçi shooter oyunlarında WM_MOUSEMOVE kullanmak risklidir. Bunun yerine Raw Input API (WM_INPUT) uygulanmalı ve input polling, render loop'tan tamamen ayrılmış, yüksek öncelikli bir thread'e taşınmalıdır.
C++ (Win32) Raw Input Uygulaması
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'i Kapatma
Unreal Engine'de, FPS dalgalanmalarında input lag hissini azaltmak için PlayerController üzerinden mouse smoothing'i mutlaka kapatın.
Zincirleme Etki: Client Lag ve Server Rollback
Input lag, sunucu tarafında reconciliation mantığını tetikleyerek rubberbanding'e yol açar. Bu durum How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer makalesindeki senaryolara benzer.
horizOn kullanarak, bu tür senkronizasyon sorunlarına karşı korumalı, optimize edilmiş oyun sunucuları kurabilirsiniz.
PC Input İçin 5 En İyi Pratik
- Input'u Render'dan Ayırın: 1000Hz polling yapan bağımsız bir thread kullanın.
- DXGI Flip Model Kullanın: DWM kompozisyonunu baypas ederek gecikmeyi azaltın.
- Hardware Cursor Kullanın: UI dokuları yerine işletim sistemi imlecini kullanın.
- Hook Enjeksiyonlarına Karşı Uyarın: Overlay DLL'lerini tespit edince oyuncuyu bilgilendirin.
- Fixed Timestep Simulation Kullanın: Fizik ve input'u sabit zaman adımlarıyla işleyin.
Sonuç
Geliştiriciler Raw Input ve thread ayırma yöntemlerini benimsemelidir. Backend tarafında ise sunucu orkestrasyonu için horizOn kullanarak iş yükünüzü hafifletebilirsiniz.