Megapack: كيف حل Factorio مشكلة اللاعبين المتعددين 200 لاعب

Megapack: كيف حل Factorio مشكلة اللاعبين المتعددين 200 لاعب
في مايو من هذا العام ، شاركت كلاعب في أحداث KatherineOfSky MMO. لاحظت أنه عندما يصل عدد اللاعبين إلى رقم معين ، كل بضع دقائق "يسقط" بعضهم. لحسن حظك (ولكن ليس بالنسبة لي) ، كنت أحد هؤلاء اللاعبين كل مرةحتى مع وجود اتصال جيد. اعتبرته بمثابة تحد شخصي وبدأت في البحث عن أسباب المشكلة. بعد ثلاثة أسابيع من التصحيح والاختبار والإصلاح ، تم إصلاح الخطأ أخيرًا ، لكن الرحلة لم تكن بهذه السهولة.

من الصعب جدًا تعقب المشكلات في الألعاب متعددة اللاعبين. تحدث عادةً في ظل معلمات شبكة محددة جدًا وفي ظل حالات لعب محددة جدًا (في هذه الحالة ، أكثر من 200 لاعب). وحتى عندما يمكن تكرار مشكلة ، لا يمكن تصحيحها بشكل صحيح لأن إدخال نقاط التوقف يوقف اللعبة ، ويفسد الموقتات ، وعادة ما يتسبب في انتهاء مهلة الاتصال بسبب انتهاء المهلة. ولكن بفضل المثابرة وأداة رائعة تسمى أخرق تمكنت من معرفة ما يحدث.

باختصار ، نظرًا لوجود خطأ وتنفيذ غير مكتمل لمحاكاة حالة التأخير ، وجد العميل نفسه أحيانًا في موقف كان عليه فيه إرسال حزمة شبكة في دورة ساعة واحدة ، تتكون من إجراءات إدخال اللاعب لاختيار ما يقرب من 400 كيان لعبة ( نسميها "megapacket"). بعد ذلك ، لا يحتاج الخادم إلى تلقي جميع إجراءات الإدخال هذه بشكل صحيح فحسب ، بل يحتاج أيضًا إلى إرسالها إلى جميع العملاء الآخرين. إذا كان لديك 200 عميل ، فستصبح هذه مشكلة بسرعة. تصبح القناة إلى الخادم مسدودة بسرعة ، مما يؤدي إلى فقدان الحزم وسلسلة من الحزم المعاد طلبها. يؤدي تأجيل إجراءات الإدخال بعد ذلك إلى بدء المزيد من العملاء في إرسال حزم ضخمة ، ويصبح انهيارهم الجليدي أقوى. ينجح العملاء الناجحون في التعافي ، بينما يسقط الباقي.

Megapack: كيف حل Factorio مشكلة اللاعبين المتعددين 200 لاعب
كانت المشكلة أساسية للغاية ، واستغرق الأمر أسبوعين لإصلاحها. إنها تقنية جدًا ، لذا سأشرح التفاصيل الفنية المثيرة أدناه. لكن أولاً ، عليك أن تعرف أنه منذ الإصدار 2 ، الذي تم إصداره في 0.17.54 يونيو ، في مواجهة مشاكل الاتصال المؤقتة ، أصبح تعدد اللاعبين أكثر استقرارًا ، والتأخير في الاختباء أصبح أقل تعقيدًا (أقل كبح ونقل فوري). أيضًا ، لقد غيرت الطريقة التي يتم بها إخفاء تأخيرات القتال ، وآمل أن يجعل ذلك الأمر أكثر سلاسة.

Multiplayer Mega Pack - التفاصيل الفنية

لتوضيح الأمر ببساطة ، تعمل لعبة تعدد اللاعبين على النحو التالي: يقوم جميع العملاء بمحاكاة حالة اللعبة من خلال تلقي وإرسال مدخلات اللاعب فقط (تسمى "إجراءات الإدخال" إجراءات الإدخال). المهمة الرئيسية للخادم هي النقل إجراءات الإدخال والتأكد من أن جميع العملاء يقومون بنفس الإجراءات في نفس الدورة. يمكنك قراءة المزيد عن هذا في المنشور. فف-149.

نظرًا لأن الخادم يجب أن يتخذ قرارات بشأن الإجراءات التي يجب اتخاذها ، فإن إجراءات اللاعب تتحرك على طول المسار التالي: إجراء اللاعب -> عميل اللعبة -> الشبكة -> الخادم -> الشبكة -> عميل اللعبة. هذا يعني أن كل إجراء للاعب يتم تنفيذه فقط بعد أن يكون قد صنع مسارًا ذهابًا وإيابًا عبر الشبكة. لهذا السبب ، كانت اللعبة تبدو بطيئة للغاية ، لذلك فور ظهور اللعب الجماعي في اللعبة ، تم تقديم آلية لإخفاء التأخيرات. يحاكي إخفاء زمن الوصول إدخال اللاعب دون مراعاة تصرفات اللاعبين الآخرين واتخاذ قرارات الخادم.

Megapack: كيف حل Factorio مشكلة اللاعبين المتعددين 200 لاعب
لدى Factorio حالة لعبة حالة اللعبة هي الحالة الكاملة للخريطة واللاعب والكيانات وكل شيء آخر. يتم محاكاته بشكل حاسم في جميع العملاء بناءً على الإجراءات المتلقاة من الخادم. حالة اللعبة مقدسة ، وإذا بدأت في الاختلاف عن الخادم أو أي عميل آخر ، فسيحدث إلغاء التزامن.

إلا حالة اللعبة لدينا حالة من التأخير دولة الكمون. يحتوي على مجموعة فرعية صغيرة من الدولة الرئيسية. دولة الكمون ليس مقدسًا ويمثل فقط صورة لما ستبدو عليه حالة اللعبة في المستقبل بناءً على مدخلات اللاعب إجراءات الإدخال.

للقيام بذلك ، نحتفظ بنسخة من ملف إجراءات الإدخال في قائمة انتظار التأخير.

Megapack: كيف حل Factorio مشكلة اللاعبين المتعددين 200 لاعب
أي في نهاية العملية من جانب العميل ، تبدو الصورة كما يلي:

  1. يتقدم إجراءات الإدخال كل اللاعبين حالة اللعبة طريقة تلقي إجراءات الإدخال هذه من الخادم.
  2. قم بإزالة كل شيء من قائمة انتظار التأخير إجراءات الإدخال، والتي ، وفقًا للخادم ، تم تطبيقها بالفعل عليها حالة اللعبة.
  3. يمسح دولة الكمون وإعادة تعيينه بحيث يبدو تمامًا مثل حالة اللعبة.
  4. تطبيق جميع الإجراءات من قائمة انتظار التأخير إلى دولة الكمون.
  5. بناء على البيانات حالة اللعبة и دولة الكمون اعرض اللعبة على اللاعب.

كل هذا يتكرر في كل نبضة.

صعب جدا؟ لا تسترخي ، هذا ليس كل شيء. للتعويض عن اتصالات الإنترنت غير الموثوقة ، أنشأنا آليتين:

  • علامات التجزئة التي تم تخطيها: عندما يقرر الخادم ذلك إجراءات الإدخال سيتم تنفيذه في لباقة اللعبة ، ثم إذا لم يستلمها إجراءات الإدخال بعض اللاعبين (على سبيل المثال ، بسبب التأخير المتزايد) ، لن ينتظر ، لكنه سيبلغ هذا العميل "لم أضع في الاعتبار إجراءات الإدخال، سأحاول إضافتها في الشريط التالي. يتم ذلك بحيث لا يبطئ تحديث الخريطة لأي شخص آخر نظرًا لوجود مشكلات في الاتصال (أو بالكمبيوتر) لأحد اللاعبين. من الجدير بالذكر أن إجراءات الإدخال لا يتم تجاهلها ، بل يتم تأجيلها ببساطة.
  • زمن انتقال ذهابًا وإيابًا: يحاول الخادم تخمين زمن انتقال ذهابًا وإيابًا بين العميل والخادم لكل عميل. كل 5 ثوانٍ ، يتفاوض على تأخير جديد مع العميل حسب الحاجة (اعتمادًا على كيفية تصرف الاتصال في الماضي) ، ويزيد أو يقلل من تأخير رحلة الذهاب والإياب وفقًا لذلك.

هذه الآليات في حد ذاتها بسيطة للغاية ، ولكن عند استخدامها معًا (وهو ما يحدث غالبًا مع مشكلات الاتصال) ، يصبح من الصعب إدارة منطق الكود ومع الكثير من حالات الحافة. بالإضافة إلى ذلك ، عندما يتم تشغيل هذه الآليات ، يجب أن يقوم الخادم وقائمة انتظار التأخير بتنفيذ ملف إجراء الإدخال دعا قم بإيقاف الحركة في التالي. بفضل هذا ، في حالة وجود مشاكل في الاتصال ، لن تعمل الشخصية بمفردها (على سبيل المثال ، تحت القطار).

الآن أريد أن أشرح لك كيف يعمل اختيار الكيانات. أحد الأنواع التي تم تمريرها إجراء الإدخال هو تغيير في حالة اختيار الكيان. إنه يخبر الجميع عن الكيان الذي يحوم اللاعب فوقه بالماوس. كما ترى ، يعد هذا أحد أكثر إجراءات الإدخال شيوعًا التي يرسلها العملاء ، لذا لتوفير النطاق الترددي ، قمنا بتحسينه بحيث يشغل أقل مساحة ممكنة. يتم تنفيذ هذا على النحو التالي: عند تحديد كل كيان ، بدلاً من تخزين إحداثيات خريطة مطلقة وعالية الدقة ، تقوم اللعبة بتخزين إزاحة نسبية منخفضة الدقة من التحديد السابق. يعمل هذا بشكل جيد لأن تحديد الماوس يحدث عادةً بالقرب من التحديد السابق. يؤدي هذا إلى مطلبين مهمين: إجراءات الإدخال لا يجب تخطيها مطلقًا ويجب أن يتم ذلك بالترتيب الصحيح. يتم استيفاء هذه المتطلبات ل حالة اللعبة. لكن منذ المهمة حالة الكمون في "المظهر الجيد بما فيه الكفاية" للاعب ، فهم غير راضين في حالة التأخير. دولة الكمون لا تأخذ بعين الاعتبار العديد من الحالات الحدوديةالمرتبطة بتخطي الساعات وتغيير تأخيرات الإرسال ذهابًا وإيابًا.

يمكنك بالفعل تخمين إلى أين يتجه هذا. أخيرًا ، بدأنا في رؤية أسباب مشكلة الحزمة الضخمة. جذر المشكلة هو أن منطق اختيار الكيان يعتمد عليه دولة الكمون، ولا تحتوي هذه الحالة دائمًا على المعلومات الصحيحة. لذلك يتم إنشاء حزمة الضخامة على النحو التالي:

  1. المشغل يواجه مشكلات في الاتصال.
  2. تلعب آليات تخطي الدورات وتنظيم تأخير الإرسال ذهابًا وإيابًا.
  3. لا تأخذ قائمة انتظار حالة التأخير في الحسبان هذه الآليات. يؤدي هذا إلى إزالة بعض الإجراءات قبل الأوان أو تشغيلها بترتيب خاطئ ، مما يؤدي إلى خطأ دولة الكمون.
  4. لا يواجه اللاعب مشكلة في الاتصال ويقوم بمحاكاة ما يصل إلى 400 دورة للحاق بالخادم.
  5. في كل دورة ، يتم إنشاء إجراء جديد وإعداده لإرساله إلى الخادم ، مما يؤدي إلى تغيير اختيار الكيان.
  6. يرسل العميل حزمة ضخمة من أكثر من 400 تغيير في اختيار الكيان إلى الخادم (ومع إجراءات أخرى: حالة التشغيل ، وحالة المشي ، وما إلى ذلك ، عانت أيضًا من هذه المشكلة).
  7. يتلقى الخادم 400 إجراء إدخال. نظرًا لأنه لا يُسمح بتخطي إجراء إدخال فردي ، فإنه يوجه جميع العملاء لتنفيذ هذه الإجراءات وإرسالها عبر الشبكة.

المفارقة هي أن آلية مصممة للحفاظ على عرض النطاق الترددي نتج عنها حزم شبكة ضخمة.

لقد حللنا هذه المشكلة من خلال إصلاح جميع حالات حافة التحديث ودعم قائمة انتظار التأخير. على الرغم من أن الأمر استغرق بعض الوقت ، إلا أنه كان يستحق القيام بذلك بشكل صحيح في النهاية بدلاً من الاعتماد على الاختراقات السريعة.

المصدر: www.habr.com

إضافة تعليق