فعل الخير متعددة/mmo العميل<>server الألعاب استخدام الكمون داخل حركة الحسابات ؟

StackOverflow https://stackoverflow.com/questions/1448997

سؤال

هناك بعض الأسئلة هنا.

تخيل لدي العميل الذي سوف يرسل الرسالة التالية إلى الملقم:"بدء الحركة إلى الأمام".

الخادم لن تتلقى هذه الرسالة على الفور ، كما أن هناك تأخير بسبب الكمون.

السؤال 1:بينغ (أو أفضل: الوقت ذهابا وإيابا) هو مقدار الوقت الذي يستغرقه العميل بإرسال رسالة إلى الخادم والحصول على رد.هل هذا يعني التالية إذا كان يمكنك تجاهل الوقت الذي يستغرقه الخادم لاحظت أنه تلقى رسالة والبدء في إرسال الرد (وهذا ينبغي أن تكون قصيرة جدا)?

  1. الوقت الذي يستغرقه العميل أن يرسل به إلى الخادم = ذهابا وإيابا لمرة / 2
  2. الوقت الذي يستغرقه الخادم و العميل = ذهابا وإيابا لمرة / 2

لذا عندما العميل بإرسال رسالة خادم المفترض أن تتلقى رسالة ذهابا وإيابا لمرة / 2 ميلي ثانية بعد العميل إرسال الرسالة.هذا يقودني إلى السؤال التالي.

السؤال 2:يجب على العميل إرسال أول حزمة, ثم الانتظار ذهابا وإيابا لمرة / 2 ميلي ثانية قبل تنفيذ هذا الأمر من جانب العميل (في هذه الحالة:التحرك إلى الأمام) إلى تعويض مع الكمون/التخلف ؟

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

السؤال 3:يجب على العميل استلام رسالة أخرى عميل انتقلت تأخذ في الاعتبار أن هذه الرسالة تم إرسالها من قبل الملقم ذهابا وإيابا لمرة / 2 ميلي ثانية مضت ؟ حتى أن الوقت الحالي تستخدم حركة الحسابات الطوابع ينبغي تخفيض ذهابا وإيابا لمرة / 2?

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

هل كانت مفيدة؟

المحلول

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

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

بالطبع هناك أيضا تحدث حيث يقوم الخادم ببساطة باتخاذ الموقف الذي أرسله العميل ويضصده عمياء. هذه هي الألعاب التي تعرضها عموما لمخالفات النقل عن بعد.

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

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

بالطبع هذا التغييرات من المحرك إلى المحرك، لكنه متراو عام إلى حد ما.

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

نصائح أخرى

هذا هو السؤال القديم ولكن لقد عملت التعليمات البرمجية مشابهة في الآونة الأخيرة ربما هذا سوف يساعد شخص ما.

نعم الكمون هو دائما مفيدة في الحساب.ولكن هذا هو قليلا أكثر تعقيدا من RTT.ذهابا وإيابا الوقت يتغير دائما...الشبكة رمز يمكن أن تبقى في المتوسط ، ولكن الفرق من أن متوسط كبير.

المحلي العميل عن بعد عميل ملقم جميع التنبؤ الوضع الحالي باستخدام الخوارزميات.البيانات التالية هي قريبة من نموذجية:

  • الوقت:t
  • التنسيب:موقف (x,y,z) و التوجه (x,y,z,w)
  • الحركة:الحركة الخطية ناقلات إعطاء الاتجاه مع طول السرعة (x,y,z) ، حركة دورانية ناقلات إعطاء محور مع طول سرعة الدوران (x,y,z)

تحتاج الخوارزميات التي استقراء من [T,P,M] تعيين simtime.لن يتم توفير هذه هنا.

عند تسجيل العميل تغيير في قيادة السفينة في [T,P,M] لن نصل إلى الخادم حتى T+deltaT.ولكن إذا deltaT في التسامح شبكة نموذجية الإختفاء الخادم أن يقول "نعم حدث ذلك في ر ، وأنا أقبل ذلك." وإلا فإنه قد ترغب في تصحيح العميل قائلا "لا هذا من التسامح ، حدث ذلك في الوقت T' " في هذه الحالة العميل سوف تضطر إلى إعادة تشغيل كل وقت لاحق مدفوعة [T,P,M] التغييرات من خادم تصحيح واحد (وهذا يعني أنك بحاجة للحفاظ على طابور أو قائمة بها).

التالي العميل سوف تحصل عليه في T+deltaT+differentdeltaT.لا يمكن تغيير ما لديه بالفعل محاكاة ، حتى إذا لم يكن تأخير انها محاكاة هذا القفز البعيد السفينة و سوف ترى رعشة الإطار.هذا هو السبب البعيد مدفوعة السفن يجب أن يكون المحاكاة تأخر وقت الدوام أكبر من 2*typicaldeltaT.ينبغي أن تكون ثابتة إبطاء أو تأخير التغييرات تدريجيا ، وفي أوقات التأخير الشديد سوف ترى رعشة إطارات ومع ذلك

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

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

لا تأخير المحلية محاكاة عندما المحلي "الرمزية" التحركات.ويبدو أيضا طريقة الاستجابة.هل يمكن أن يؤخر ذلك قليلا (حتى ربما 50ms) للمساعدة في تحسين التزامن ، لكن تأخير طول الطريق إلى RTT من شأنها أن تجعل اللعبة تبدو محبط لا تستجيب.مجموعة الخيار المحلي التأخير واللعب معها ، لأنه صغير ثابت تأخير يمكن أن يكون مقبولا و تحسين المزامنة.لكن ليس من الضروري أن يسبب الكثير من المشاكل لذلك أنا أوصي به أن رمز آخر.(إذا كنت تحاول أن تفعل FPS المشاجرة اللعبة, سوف تحتاج إلى القيام بذلك كل مساعدة يمكن أن تحصل).

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

المحاكاة لن يكون محكم متزامنة.أنها يجب أن تبقى في 400ms أو حتى على الإنترنت ولكن بالتأكيد سوف الضالة خارج أوقات تأخر...إلى 30 ثانية أو أكثر ، عليك أن تتسامح مع الأشياء التي لأنها ليست نادرة.وبما أن الإنترنت محدودة بسبب سرعة الضوء في النحاس, هل يمكن أن نتوقع دائما في اتجاه واحد الإختفاء إلى عادة تكون في حدود ما لا يقل عن 100ms الحد الأدنى الخاص بك الآن العملاء في كثير من الأحيان 500ms أو أكثر.

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

حظا سعيدا.

ل Q1: أن يبدو صحيحا بالنسبة لي.

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

q3: يحتاج العملاء فقط حقا إلى معرفة أنهم يحاكيون في الوقت العاشر x، ويقول الخادم مجموعة الأحداث {a، b، c} في بعض الأحيان {x، y، z}. ثم يمكن للعميل والخادم محاكاة إلى الأمام بنفس المعلومات والبقاء بشكل عام في المزامنة (إلا عند حدوث تعارضات متزامنة). في تلك الحالات، لديك خدمة إعادة مزامنة الخادم حتى ينتهي بك الأمر في حدود خطأ ضيق للغاية وخبرة سلسة للغاية.

إذا كان هدفك هو تحسين تصور الزمن، فقد تحاول أيضا الثقة بالعميل.

هناك العديد من نماذج الشبكة لحل هذه المشاكل؛

في لعبة الشبكة، تحتاج إلى مزامنة شيئين، واحد هو الوقت، الآخر هو الفضاء.

  1. نموذج لعبة الشبكة يسمى Lockstep؛

يجب أن يكون لديك إلقاء نظرة على المقالة التي كتبها Age of Empire2 Game Studio، والتي تصف التفاصيل في نموذج Lockstep.

في هذا النموذج، تشغيل إطار منطق العميل والخادم إطار المنطق حسب الإطار، على سبيل المثال، يستخدم RTS 100ms كإطار، خادم وعميل سيقوم بمزامنة معرف الإطار، مما يعني مزامنة الوقت.

العميل في الإطار 50، أرسل أمرية أمر، ولكن لا يتم تشغيله على الفور، سيقوم العميل بإخبار الخادم بتشغيل الأمر Move في الإطار 51؛ ثم عندما يأتي الإطار 51، سيقوم الخادم والعميل بتشغيل الأمر في نفس الوقت. لذلك سيكون منطق العميل والخادم نفسه.

في هذا النموذج، سيتم تشغيل العميل والخادم الإطار والخادم الصادر عند الإطار 49 ربما، لذلك هناك 100ms Alway أو أكثر تأخير في تعليقات إدخال العميل.

لا يحتوي التأخر بين العميل والخادم على الشبكة فقط RTT، ولكن يحتوي أيضا على تأخير إطار المنطق، وهو 100ms؛

في هذا النموذج، لمزامنة المساحة، تحتاج إلى جعل رمز العميل ورمز الخادم المحدد، لذلك يمكنهم فقط مزامنة الأمر والأهوال، لا توجد احتياجات لمزامنة حالة الكيان.

في هذا النموذج، تكون ردود الفعل الإدخال كبيرة، لذلك تحتاج إلى لعب الرسوم المتحركة أو الصوت للمساعدة في تجاهل اللاعب التأخر.

  1. نماذج أخرى تستخدم مزامنة الدولة

في هذا النموذج، نحتاج أيضا إلى مزامنة الوقت، لذلك سيقوم العميل بتخمين ما هو الوقت الحالي في الخادم.

عند إدخال اللاعبين، يتحرك العميل على الفور، ثم أرسل الأمر "نقل" أو هدف العميل المستهدف إلى الخادم مع TimeStamp Server الحالي، والذي يقدر العميل.

عندما يتلقى الخادم أمر العميل، فإنه يعرف متى يتم إصدار الأمر في وقت الخادم عن طريق العميل، وسوف يحاول تشغيل الأمر باستخدام الاستقراء.

سيحصل جميع العملاء الآخرين على الأمر، مع وقت الخادم الخاص به، سيحاول جميع العملاء الآخرين استقراء الأمر.

تشمل هذه التقنيات التنبؤ العميل، تعويضات خوادم تأخر، واستيفاء كيان الخادم.

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

في لعبة الشبكة، هناك أمرين على الأقل نوعين، أولا مثل الحركة، سيتم تشغيل الأمر لوقت معين، مثل دفق ثابت، وهو سمة الاستمرارية.

الآخر مثل استخدام المهارة مع الوقت البارد، سوف يستغرق تأثير الأمر الدافع، يجب علينا أن نتعامل معهم بشكل مختلف.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top