Marathon Input Issues Fix: هندسة ألعاب الـ PC للنجاة من تعارضات الـ Overlay
يعرف كل مطور ألعاب Multiplayer شعور الإحباط عند رؤية netcode تم تصميمه ببراعة ينهار بسبب Discord overlay. تقضي شهوراً في تحسين البنية التحتية للسيرفر لتقليل الـ latency إلى أقل من 30ms، لتكتشف أن اللاعبين يخطئون أهدافهم لأن تطبيق streaming في الخلفية يخنق input thread الخاص باللعبة.
هذا السيناريو يحدث حالياً في Server Slam للعبة Marathon القادمة من Bungie. يبلغ لاعبو الـ PC عن mouse lag شديد وسقوط في الـ inputs. اعترفت Bungie بالمشكلة رسمياً، مشيرة إلى أدوات الطرف الثالث و streamer overlays كسبب رئيسي.
يبحث آلاف اللاعبين الآن عن marathon input issues fix. الحل المؤقت هو عمل stream للشاشة كاملة بدلاً من نافذة اللعبة وتعطيل الـ overlays.
لكن بالنسبة للمطورين، السؤال هو: كيف نصمم ألعابنا لمنع تطبيقات الـ streaming من اختطاف الـ inputs؟
في هذا التحليل التقني، سنناقش معالجة الـ input في Windows، ولماذا يسبب OBS مشاكل في frame pacing، وكيفية فصل input threads.
السبب الرئيسي: كيف تختطف الـ Overlays مسار الرندر
تطبيقات مثل OBS تحقن DLL داخل عملية اللعبة وتقوم بعمل hook لـ Present في DirectX.
عنق زجاجة الـ Swap Chain
من خلال عمل hook للـ swap chain، يجبر الـ overlay المحرك على الانتظار. الفريم الذي يجب أن يستغرق 16.6ms يستغرق فجأة 24ms. وبما أن معظم المحركات تفحص WM_MOUSEMOVE في الـ main thread قبل الرندر، فإن تأخير الرندر يؤخر الـ input polling.
الحل: Raw Input API
يجب على المطورين استخدام Raw Input API (WM_INPUT) في thread مستقل وعالي الأولوية مفصول تماماً عن render loop.
تنفيذ Raw Input في C++
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 لتجنب الـ lag عند تذبذب الـ FPS.
تأخير العميل مقابل Server Rollback
تأخير الـ input يؤدي لتأخر وصول الحزم للسيرفر، مما يفعل منطق الـ reconciliation ويسبب rubberbanding، كما هو موضح في How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer.
باستخدام horizOn، يمكنك نشر سيرفرات محسنة مع حماية مدمجة ضد الـ desync.
5 ممارسات لـ Input قوي
- افصل الـ Input عن الرندر.
- استخدم DXGI Flip Model.
- استخدم Hardware Cursor.
- حذر اللاعبين من الـ Hook Injections.
- استخدم Fixed Timestep Simulation.
الخاتمة
يجب على المطورين تبني Raw Input وفصل الـ threads. بالنسبة للـ backend، استخدم horizOn للتعامل مع مزامنة السيرفرات.