آموزش ساخت بازی چندنفره: مفاهیم اوّلیّه

جلوگیری از تقلّب

اگر پیرها به هاست بگویند که کجا هستند و دارند چه کاری انجام می‌دهند، و هاست به آن‌ها اعتماد کند، می‌توانند تقلّب کنند. می‌توانند ناگهان اطّلاعاتی ارسال کنند که در طرف دیگر دیوار قرار دارند، یا بگویند پلیری را که در حقیقت به آن نرسیده‌اند زده‌اند، و…. برای کاهش تقلّب، پیرها به هاست فقط ورودی‌هایشان را می‌گویند، ورودی‌هایی مثل این‌که در حال حاضر فلان کلید جهتی را نگه داشته‌اند. هاست این ورودی‌ها را دریافت می‌کند و شروع به حرکت دادن آن پلیر می‌کند، و مکانی که پلیر در آن قرار دارد را به او ارسال می‌کند.

با این کار یک مشکل به وجود می‌آید و آن تأخیر در ورودی‌های پلیرهاست. اگر Latency بازی ما 100ms باشد، و یک پلیر کلید «چپ» را فشار دهد 100ms طول می‌کشد تا این خبر به هاست برسد. بعد 100ms دیگر طول می‌کشد تا هاست پلیر را از مکان جدیدش مطّلع کند، این یعنی همه‌ی کنترل‌های پیر خیلی با تأخیر انجام می‌شوند، کسری از ثانیه طول می‌کشد تا ورودی‌هایی که پیر وارد کرده است عمل کنند. برای حلّ این مشکل بازی‌ای که پیر می‌بیند (بازی محلّی) از پیش‌بینی ورودی محلّی[1] استفاده می‌کند.

پیش‌بینی ورودی محلّی

با فشرده‌شدن کلید چپ توسّط پلیر، پیغامی در این مورد به هاست فرستاده می‌شود، بعد در بازی محلّی، پلیر به سمت چپ حرکت می‌کند، بدون این‌که منتظر تأیید هاست بماند! از آن‌جایی‌که هاست و پیر، هر دو دارند بازی یکسانی را انجام می‌دهند، معمولاً بازی‌شان خیلی زیاد با هم تطابق دارد. حالا کنترل‌های پلیر با تأخیر مواجه نمی‌شوند، والبتّه پیرها هنوز نمی‌توانند تقلّب کنند؛ آن‌ها فقط ورودی‌هایشان را ارسال می‌کنند، و نمی‌توانند وانمود کنند که در جایی دیگر قرار دارند. حتّی اگر بازی محلّی خودشان را هک کنند بی فایده خواهد بود، چون با این کار آن‌ها خودشان را در مکان نادرستی در مقایسه با هاست می‌بینند.

در این صورت بازی‌کن پیر قطعاً خود را در محلّی نمی‌بیند که هاست دارد او را در آن محل می‌بیند. این باعث به وجود آمدن خطاهای کوچک بسیاری از جمله در تنظیم زمان شبکه، هماهنگ‌سازی نرخ فریم، اندازه‌گیری دلتا تایم (t∆) و… می‌شود. البته پیر هنوز پیام‌هایی را از هاست دریافت می‌کند که به او می‌گویند در کجا قرار دارد، امّا این پیام‌ها با تأخیر می‌رسند، در مثال قبلی، دیدیم که این پیام 200 میلی‌ثانیه بعد به پیر می‌رسد. برای تصحیح این مشکلات، موتور چندنفره با استفاده تاریخچه‌ی شیء نگاه می‌کند که شیء مزبور در 200 میلی‌ثانیه پیش در مقایسه با مکان دریافتی از هاست در چه مکانی قرار داشته است. به عبارت دیگر، اصلاحات با توجّه به این‌که شیء در گذشته (با محاسبه‌ی Latency) در چه مکانی قرار داشته است انجام می‌شوند، اگر شیء در مکان نادرستی بود، موتور چندنفره آن را به تدریج حرکت می‌دهد تا در مکان صحیح قرار بگیرد. این کار به آرامی انجام می‌شود تا کمتر به چشم بیاید. ولی در مواردی که اختلاف فاصله خیلی زیاد است، یک اصلاح بزرگ که به چشم بیاید ضروری است.

پیش‌بینی ورودی محلّی

این ویژگی فقط به مکان اشیاء محدود نمی‌شود. موتور چندنفره این توانایی را دارد که تمام این هماهنگ‌سازی‌ها را برای هر متغیّر اینستنسی هم انجام دهد، نه فقط مختصّات X و Y.

Lag

وضعیّت خراب شبکه می‌تواند تأثیرات آشکاری بر روند بازی داشته باشد. گیمرها معمولاً چنین مشکلاتی را به «lag» می‌شناسند. این مشکلات شامل موارد زیر هستند: حرکت ناهموار (وقتی تا 80 میلی‌ثانیه داده‌ها نرسند)، پرش یا ناپیوستگی در روند بازی (وقتی packet loss رخ دهد و باعث شودبه‌روزرسانی مهمّی که وضعیّت بازی را به طور قابل توجّهی تغییر می‌دهد از دست برود)، تغییر مکان ناگهانی بازی‌کن (وقتی پیش‌بینی ورودی محلّی با یک خطای بزرگ مواجه شود)، یا اتّفاقات به ظاهر غیر عادلانه‌ای که پیش می‌آید (این مشکل معمولاً نتیجه‌ی این است که بازی‌کن‌ها بازی را با تأخیرهای مختلفی مشاهده می‌کنند، و هاست به نفع یک پیر خاص تصمیم‌گیری می‌کند).

متأسّفانه راه حلّی برای این‌که همیشه از شرّ این مشکلات خلاص شویم وجود ندارد، مگر این‌که اتّصال اینترنت بهتری پیدا کنیم. این مشکلات معمولاً تحت شرایط سختی از قبیل packet loss کامل به مدّت چند ثانیه، یا تغییرات ناگهانی و شدید در latency یا PDV به وجود می‌آیند. در بعضی مواقع، برای جبران کامل lag استفاده از تکنیک‌های مختلف غیر ممکن است. گاهی اوقات این واقعیّت ارتباط اینترنتی است.

[1] Local input prediction

سؤالات فنی خود را فقط در انجمن بپرسید. در غیر این صورت پاسخ داده نخواهد شد.
۳۳ نظر

افزودن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تمامی حقوق برای مرجع تخصصی کانستراکت محفوظ است.