Marathon Input Issues Fix: Merancang Arsitektur Game PC agar Tahan Terhadap Konflik Overlay
Setiap developer game multiplayer kompetitif tahu rasanya melihat netcode yang dirancang sempurna hancur karena Discord overlay. Anda menghabiskan waktu berbulan-bulan mengoptimalkan infrastruktur server untuk latency di bawah 30ms, hanya untuk mendapati pemain meleset saat menembak karena aplikasi streaming di latar belakang mencekik input thread game Anda.
Skenario ini sedang terjadi pada Server Slam game Marathon besutan Bungie. Pemain PC melaporkan mouse lag yang parah dan input yang tidak terdaftar. Bungie secara resmi mengakui masalah ini, menunjuk utilitas pihak ketiga dan streamer overlay sebagai penyebab utama.
Ribuan pemain kini mencari marathon input issues fix. Solusi sementara bagi pemain adalah melakukan streaming seluruh monitor alih-alih menangkap jendela game saja, serta menonaktifkan overlay.
Bagi developer, ini adalah pertanyaan arsitektural: mengapa aplikasi streaming membajak input game, dan bagaimana kita merancang client PC untuk mencegahnya?
Dalam pembahasan teknis ini, kita akan menganalisis mekanisme penanganan input Windows, mengapa OBS menyebabkan masalah frame pacing, dan cara melakukan decouple pada input thread.
Akar Masalah: Bagaimana Overlay Membajak Render Pipeline
Aplikasi seperti OBS menyuntikkan DLL ke dalam proses game dan melakukan hooking pada fungsi Present di DirectX atau vkQueuePresentKHR di Vulkan.
Bottleneck pada Swap Chain
Dengan melakukan hook pada swap chain, overlay memaksa engine menunggu saat ia menyalin frame buffer. Frame yang seharusnya memakan waktu 16.6ms tiba-tiba menjadi 24ms. Karena kebanyakan engine melakukan polling WM_MOUSEMOVE pada main thread tepat sebelum render tick, keterlambatan render otomatis menunda input polling.
Solusi: Raw Input API
Jangan mengandalkan message pump standar Windows. Gunakan Raw Input API (WM_INPUT) pada thread khusus berprioritas tinggi yang terpisah dari render loop.
Implementasi Raw Input di 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: Menonaktifkan Smoothing
Di Unreal Engine, pastikan untuk menonaktifkan mouse smoothing pada PlayerController guna menghindari input lag saat framerate berfluktuasi.
Efek Berantai: Client Lag vs Server Rollback
Input lag pada client menyebabkan keterlambatan pengiriman paket ke server, memicu logika reconciliation yang mengakibatkan rubberbanding, serupa dengan masalah di How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer.
Dengan horizOn, Anda dapat menerapkan server game yang dioptimalkan dengan perlindungan bawaan terhadap desync.
5 Praktik Terbaik untuk Input PC
- Decouple Input dari Rendering.
- Gunakan DXGI Flip Model.
- Implementasikan Hardware Cursor.
- Peringatkan Pemain tentang Hook Injection.
- Gunakan Fixed Timestep Simulation.
Kesimpulan
Developer harus proaktif dengan mengimplementasikan Raw Input dan memisahkan thread input. Untuk urusan backend, gunakan horizOn agar Anda bisa fokus pada gameplay tanpa pusing memikirkan infrastruktur server.