رفتن به محتوای اصلی
Koohestun
توضیح کوهستانمعماری نت‌کدمقاله آموزشی· 7 دقیقه مطالعه· در بازی و ورزش‌های الکترونیک

چرخه تطبیق سرور و اصلاح سمت کلاینت: پیش‌بینی سمت کلاینت چگونه تاخیر بازی‌های آنلاین را پنهان می‌کند؟

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

به قلم ویدا فراهانی

معماران شبکه 40%نگهدارندگان موتور بازی 35%حامیان بازیکنان رقابتی 25%
معماران شبکه
اولویت دادن به مرجعیت سخت‌گیرانه سرور برای جلوگیری از تقلب، در حالی که تاخیر از طریق الگوریتم‌های پیش‌بینی پنهان می‌شود.
نگهدارندگان موتور بازی
تمرکز بر استانداردسازی ویژگی‌های پیچیده نت‌کد به ابزارهای در دسترس برای توسعه‌دهندگان بازی.
حامیان بازیکنان رقابتی
درخواست تیک‌ریت‌های بالا و ثبت دقیق ضربات برای تضمین یک رقابت عادلانه.

دیدگاه‌هایی که این گزارش پوشش نداده

  • ارائه‌دهندگان خدمات اینترنت
  • گیمرهای تفننی

نکات کلیدی

  • پیش‌بینی سمت کلاینت به بازی‌ها اجازه می‌دهد تا بدون انتظار برای تایید سرور، فورا به دستورات بازیکن واکنش نشان دهند.
  • سرورهای مرجع برای جلوگیری از تقلب ضروری هستند؛ به این معنی که شبیه‌سازی سرور همیشه بر پیش‌بینی کلاینت ارجحیت دارد.
  • تطبیق سرور با برگرداندن وضعیت کلاینت به عقب و بازپخش دستورات تاییدنشده، خطاهای پیش‌بینی را اصلاح می‌کند.
  • الگوریتم‌های هموارسازی، موقعیت‌های اصلاح‌شده را درون‌یابی می‌کنند تا از خطاهای بصری آزاردهنده «رابر بندینگ» جلوگیری کنند.

چرا مهم است

درک اینکه موتورهای بازی چگونه تاخیر را پنهان می‌کنند، رقص فنی و پیچیده‌ای را نشان می‌دهد که برای روان کردن تجربه بازی‌های چندنفره آنلاین ضروری است. برای گیمرها، این موضوع دلیل رخ دادن پدیده «رابر بندینگ» و بحث‌های داغ پیرامون تیک‌ریت سرورها در جوامع رقابتی را روشن می‌کند.

وقتی در یک بازی چندنفره با سرعت ۶۰ فریم بر ثانیه کلید جهت راست را فشار می‌دهید، سیستم شما انتظار دارد حرکت کاراکتر را در عرض ۱۶ میلی‌ثانیه روی صفحه رندر کند. اما در یک محیط شبکه‌ای، این دستور فیزیکی باید از طریق اینترنت به یک سرور راه دور سفر کند و برگردد تا تایید شود. اگر پینگ شما ۱۰۰ میلی‌ثانیه باشد، انتظار برای تایید حرکت توسط سرور، یک تاخیر رفت‌وبرگشت ۲۰۰ میلی‌ثانیه‌ای ایجاد می‌کند. در سبک‌های پرسرعتی مثل شوتر اول‌شخص یا شبیه‌سازهای مسابقه‌ای، یک‌پنجم ثانیه تاخیر در دریافت دستور، بازی را کاملا غیرقابل‌بازی کرده و ارتباط بازیکن را با جریان اکشن قطع می‌کند.

ریشه این تاخیر در ضرورت حیاتی معماری «سرور مرجع» نهفته است. برای جلوگیری از تقلب بازیکنان خرابکار - مثل تلپورت کردن در نقشه، شلیک از پشت دیوارهای بتنی یا دادن جان بی‌نهایت به خود - طراحی بازی‌های مدرن دیکته می‌کند که نمی‌توان به کلاینت‌های فردی برای گزارش واقعیتِ خودشان اعتماد کرد. همان‌طور که گابریل گامبتا، مهندس نرم‌افزار، اشاره می‌کند: «تنها مرجع و قدرت مطلق در مورد هر اتفاقی که در دنیای بازی می‌افتد، سرور است» [۱]. سرور دستورات را از همه بازیکنان دریافت می‌کند، شبیه‌سازی مرکزی فیزیک را اجرا می‌کند، تداخل‌ها را برطرف کرده و در نهایت، وضعیت واقعی و تاییدشده بازی را برای تمام کلاینت‌های متصل پخش می‌کند.[1]

اگر کلاینت‌ها صرفا پایانه‌های «خنگی» باشند که فقط دستورات سرور را رندر می‌کنند، تاخیر حاصل از آن اجتناب‌ناپذیر و به‌شدت کلافه‌کننده خواهد بود. برای حل این مشکل بنیادین فیزیک، توسعه‌دهندگان از تکنیکی به نام «پیش‌بینی سمت کلاینت» استفاده می‌کنند. این روش که اولین بار در ژانویه ۱۹۹۶ با نسخه اشتراک‌افزار بازی Duke Nukem 3D به ژانر شوتر اول‌شخص معرفی شد، به سیستم محلی اجازه می‌دهد تا با حدس زدن نتیجه دستورات خود پیش از آنکه سرور فرصت دخالت پیدا کند، تاخیر شبکه را کاملا دور بزند [۴]. این مدل پیش‌بینی، مهندسی بازی‌های آنلاین را از اساس متحول کرد.[4]

با پیش‌بینی محلی نتیجه یک دستور، کلاینت تاخیر رفت‌وبرگشت شبکه را دور می‌زند.

زک سینیسی، برنامه‌نویس شبکه، توضیح می‌دهد: «پیش‌بینی سمت کلاینت در اصل یعنی بازیکن دستوری می‌دهد و سیستم بدون انتظار برای دریافت آن توسط سرور، حرکت را رو به جلو شبیه‌سازی می‌کند: اکشن فوری و واکنش فوری» [۲]. وقتی بازیکن کلیدی را فشار می‌دهد، کلاینت بلافاصله کاراکتر را به صورت محلی حرکت می‌دهد، با این فرض که سرور در نهایت دستور را پردازش کرده و دقیقا به همان موقعیت می‌رسد. با جدا کردن رندر بصری از تاییدیه شبکه، بازی به اندازه یک تجربه آفلاین تک‌نفره روان و پاسخگو احساس می‌شود و تاخیر زیرین شبکه را کاملا از دید کاربر پنهان می‌کند.[2]

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

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

با این حال، وقتی کلاینت و سرور بر سر وضعیت دنیای بازی به اختلاف می‌خورند، این توهم به‌سرعت در هم می‌شکند.

برای حفظ نظم و جلوگیری از این انحراف، موتور بازی به یک چرخه پیوسته و پرسرعت از «تطبیق سرور» متکی است. بر اساس مستندات جامعه توسعه‌دهندگان ولو درباره موتور سورس: «سرور با نرخی ثابت از وضعیت فعلی جهان اسنپ‌شات می‌گیرد و این اسنپ‌شات‌ها را برای کلاینت‌ها پخش می‌کند» [۵]. این اسنپ‌شات‌ها حاوی موقعیت قطعی و غیرقابل‌انکار هر موجودیت در بازی، به همراه شماره توالی آخرین دستوری است که سرور با موفقیت از آن کلاینت خاص پردازش کرده است. این داده‌ها به عنوان یک نقطه اتکا برای واقعیت عمل می‌کنند.[5]

وقتی کلاینت یک اسنپ‌شات مرجع دریافت می‌کند، باید فورا واقعیت محلی خود را با حقیقت سرور تطبیق دهد. کلاینت وضعیت داخلی خود را به عقب برمی‌گرداند تا دقیقا با اسنپ‌شات سرور مطابقت پیدا کند. اما از آنجا که اسنپ‌شات نمایانگر گذشته است - به طور دقیق‌تر، وضعیت بازی در نیمی از زمان پینگِ پیش - کلاینت نمی‌تواند به همین جا بسنده کند. سپس باید تمام دستورات محلی ذخیره‌شده در بافر تاریخچه خود را که سرور هنگام تولید اسنپ‌شات هنوز پردازش نکرده بود، به‌سرعت بازپخش کند و چندین فریم را در کسری از میلی‌ثانیه شبیه‌سازی کند تا دوباره به زمان حال برسد [۳].[3]

وقتی سرور یک اسنپ‌شات مرجع می‌فرستد، کلاینت برای حفظ همگام‌سازی، دستورات اخیر خود را به عقب برگردانده و بازپخش می‌کند.

این چرخه عقب‌گرد و بازپخش، به‌طور یکپارچه در پس‌زمینه اتفاق می‌افتد؛ اغلب ده‌ها بار در ثانیه بدون اینکه بازیکن هرگز متوجه شود. اگر وضعیت بازپخش‌شده با وضعیت پیش‌بینی‌شده فعلی کلاینت مطابقت داشته باشد، بازیکن هیچ‌چیز حس نمی‌کند؛ پیش‌بینی بی‌نقص بوده است. اما اگر اسنپ‌شات سرور مغایرتی را نشان دهد - مثلا بازیکن در اثر انفجاری که هنوز ندیده به عقب پرتاب شده باشد - موقعیت محاسبه‌شده جدید کلاینت با جایی که کاراکتر در حال حاضر روی مانیتور رندر شده متفاوت خواهد بود. این مغایرت، موتور بازی را مجبور می‌کند تا برای اصلاح خطا بدون نابود کردن تجربه بازیکن، دست به انتخابی دشوار بزند.

پرش ناگهانی کاراکتر به موقعیت اصلاح‌شده، یک خطای بصری آزاردهنده ایجاد می‌کند که معمولا به عنوان «رابر بندینگ» شناخته می‌شود؛ جایی که به نظر می‌رسد بازیکن با شدت به عقب یا پهلو تلپورت می‌شود. برای کاهش این اثر گیج‌کننده، موتورها از الگوریتم‌های هموارسازی پیچیده‌ای استفاده می‌کنند. به جای یک پرش خشن به مختصات واقعی، کلاینت موقعیت کاراکتر را در چند فریم بعدی درون‌یابی می‌کند و آن‌ها را به‌آرامی به سمت موقعیت مرجع سرور سُر می‌دهد؛ طوری که به جای یک گلیچ، شبیه به یک تنه فیزیکی خفیف احساس شود [۴].[4]

فرکانس کل این چرخه پیش‌بینی، توسط تیک‌ریت سرور کنترل می‌شود. سروری که با ۶۴ تیک بر ثانیه اجرا می‌شود - که پیش‌فرض تاریخی بسیاری از عناوین ولو است - شبیه‌سازی جهان را هر ۱۵٫۶ میلی‌ثانیه به‌روزرسانی می‌کند [۵]. تیک‌ریت‌های بالاتر، مانند سرورهای ۱۲۸ تیک که به‌شدت محبوب شوترهای تاکتیکی رقابتی هستند، زمان بین اسنپ‌شات‌ها را به تنها ۷٫۸ میلی‌ثانیه کاهش می‌دهند. این پنجره زمانی محدودتر، چرخه تطبیق را فشرده‌تر کرده، بزرگی خطاهای پیش‌بینی را به حداقل می‌رساند و تضمین می‌کند که واقعیتِ حدس‌زده‌شده توسط کلاینت هرگز از حقیقت سرور خیلی دور نشود.[5]

تیک‌ریت‌های بالاتر زمان بین اسنپ‌شات‌های سرور را کاهش داده و خطاهای پیش‌بینی را به حداقل می‌رسانند.

در حالی که پیش‌بینی سمت کلاینت حرکت بازیکن محلی را مدیریت می‌کند، یک سیستم موازی به نام «جبران لگ» تعاملات با سایر بازیکنان را کنترل می‌کند. از آنجا که هر کلاینت در حال پیش‌بینی حرکت خود و دریافت به‌روزرسانی‌های تاخیردار درباره دیگران است، بازیکنان در واقع به ارواحِ موقعیتِ گذشته حریفان خود شلیک می‌کنند. جبران لگ به سرور اجازه می‌دهد تا هیت‌باکس سایر بازیکنان را به عقب برگرداند تا دقیقا با آنچه تیرانداز در لحظه کشیدن ماشه روی صفحه خود دیده مطابقت داشته باشد؛ این کار تضمین می‌کند شلیکی که به صورت محلی دقیق به نظر می‌رسید، در سطح جهانی نیز پاداش داده شود [۵].[5]

این سیستم‌های به‌هم‌پیوسته در کنار هم، پایه و اساس نامرئی و بسیار پیچیده بازی‌های چندنفره آنلاین مدرن را تشکیل می‌دهند. آن‌ها در واقع تاخیر را از بین نمی‌برند، بلکه آن را پشت یک رقص درخشان از اجرای گمانه‌زنانه، بازبینی تاریخی و هموارسازی ریاضی پنهان می‌کنند [۶]. دفعه بعد که یک کاراکتر دیجیتالی با فشردن یک کلید فورا حرکت کرد، به این دلیل نیست که شبکه بی‌نهایت سریع است. به این دلیل است که کلاینت با موفقیت آینده را پیش‌بینی می‌کند و سرور بی‌سروصدا گذشته را تطبیق می‌دهد. همین تعادل ظریف بین اعتماد و مرجعیت است که گیمینگ رقابتی را در مقیاس جهانی امکان‌پذیر می‌کند.[6]

اصطلاحات کلیدی

سرور مرجع (Authoritative Server)
یک معماری شبکه که در آن سرور مرکزی حرف آخر را در مورد تمام قوانین، موقعیت‌ها و رویدادهای بازی می‌زند و از تقلب کلاینت‌ها جلوگیری می‌کند.
پیش‌بینی سمت کلاینت (Client-Side Prediction)
تکنیکی که در آن کلاینت محلی بازی، بدون انتظار برای تایید سرور، دستور بازیکن را فورا شبیه‌سازی کرده و تاخیر شبکه را پنهان می‌کند.
تطبیق سرور (Server Reconciliation)
فرآیندی که طی آن یک کلاینت وضعیت پیش‌بینی‌شده بازی خود را اصلاح می‌کند تا با اسنپ‌شات قطعی ارسال‌شده توسط سرور مرجع مطابقت داشته باشد.
تیک‌ریت (Tick Rate)
فرکانسی که یک سرور بازی شبیه‌سازی داخلی خود را به‌روزرسانی کرده و اسنپ‌شات‌ها را برای کلاینت‌های متصل پخش می‌کند؛ معمولا بر اساس تعداد به‌روزرسانی در ثانیه اندازه‌گیری می‌شود.
رابر بندینگ (Rubber-Banding)
یک خطای بصری آزاردهنده که در آن به نظر می‌رسد کاراکتر بازیکن به عقب تلپورت می‌شود؛ این اتفاق به دلیل پرش کلاینت به موقعیت اصلاح‌شده سرور پس از یک پیش‌بینی اشتباه رخ می‌دهد.

پرسش‌های متداول

اگر کلاینت من حرکتی را پیش‌بینی کند اما سرور آن را رد کند چه اتفاقی می‌افتد؟

سرور یک اسنپ‌شات با موقعیت واقعی شما ارسال می‌کند. سپس کلاینت شما این تفاوت را تطبیق می‌دهد که اغلب منجر به یک پرش بصری یا اثر رابر بندینگ می‌شود، زیرا کاراکتر شما به موقعیت مرجع کشیده می‌شود.

چرا برخی بازی‌ها از سرورهای ۶۴ تیک و برخی دیگر از ۱۲۸ تیک استفاده می‌کنند؟

تیک‌ریت‌های بالاتر به‌روزرسانی‌های مکررتری (هر ۷٫۸ میلی‌ثانیه برای ۱۲۸ تیک) ارائه می‌دهند که منجر به پیش‌بینی روان‌تر و ثبت دقیق‌تر ضربات می‌شود. با این حال، آن‌ها به قدرت پردازش سرور و پهنای باند بسیار بیشتری از سوی بازیکن نیاز دارند.

آیا پیش‌بینی سمت کلاینت همان جبران لگ است؟

خیر. پیش‌بینی سمت کلاینت با حدس زدن واکنش سرور، تاخیر را برای حرکت خود شما پنهان می‌کند. جبران لگ یک تکنیک سمت سرور است که زمان را به عقب برمی‌گرداند تا با دقت قضاوت کند که آیا شلیک‌های شما به سایر بازیکنان در حال حرکت اصابت کرده است یا خیر.

منابع

پوشش منابع

6 منبع

3 دیدگاه شناسایی‌شده

معماران شبکه 40%نگهدارندگان موتور بازی 35%حامیان بازیکنان رقابتی 25%
  1. [1]Gabriel Gambettaمعماران شبکه

    Fast-Paced Multiplayer (Part I): Client-Server Game Architecture

    مطالعه در Gabriel Gambetta
  2. [2]Zack Sinisiمعماران شبکه

    Multiplayer Client-side Prediction and Server Reconciliation Demystified

    مطالعه در Zack Sinisi
  3. [3]Game Developerمعماران شبکه

    UNET Unity 5 Networking Tutorial Part 2 of 3 - Client Side Prediction and Server Reconciliation

    مطالعه در Game Developer
  4. [4]Wikipediaنگهدارندگان موتور بازی

    Client-side prediction

    مطالعه در Wikipedia
  5. [5]Valve Developer Communityنگهدارندگان موتور بازی

    Source Multiplayer Networking

    مطالعه در Valve Developer Community
  6. [6]تیم سردبیری کوهستانحامیان بازیکنان رقابتی

    تحلیل تیم سردبیری کوهستان

    مطالعه در تیم سردبیری کوهستان

نظرات

همیشه در جریان باشید

هر زاویه. هر روز.

دریافت بازی و ورزش‌های الکترونیک اخبار همراه با پوشش کامل منابع و تحلیل دیدگاه‌ها، مستقیم در صندوق ورودی شما.