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

مکانیزم نت‌کد رول‌بک: بازی‌های مبارزه‌ای چگونه برای نابودی لگ، آینده را پیش‌بینی می‌کنند؟

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

به قلم سپیده توکلی

مهندسان شبکه 40%بازیکنان رقابتی 30%توسعه‌دهندگان موتور بازی 30%
مهندسان شبکه
اولویت آن‌ها شبیه‌سازی قطعی و سریال‌سازی کارآمد وضعیت بازی برای جلوگیری از قطع همگام‌سازی (Desync) است.
بازیکنان رقابتی
حفظ حافظه عضلانی آفلاین را بسیار ارزشمندتر از ثبات بصری می‌دانند.
توسعه‌دهندگان موتور بازی
برای تطبیق با شبیه‌سازی مجدد و سریع وضعیت بازی، با محدودیت‌های شدید بودجه پردازنده روبرو هستند.

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

  • بازیکنان کژوال
  • ارائه‌دهندگان خدمات اینترنت

روند رویداد

  1. ۲۰۰۹

    تونی کانن کیت توسعه شبکه GGPO را منتشر کرد و ثابت نمود که نت‌کد رول‌بک می‌تواند با موفقیت تاخیر را در بازی‌های مبارزه‌ای همتا به همتا پنهان کند.

  2. ۲۰۲۰

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

  3. ۲۰۲۳

    معماری رول‌بک به استاندارد بلامنازع صنعت تبدیل شد و تقریباً تمام فرنچایزهای بزرگ بازی‌های مبارزه‌ای با پشتیبانی بومی از این سیستم عرضه شدند.

وقتی کیت توسعه شبکه GGPO در سال ۲۰۰۹ منتشر شد، فیزیک بنیادین رقابت‌های آنلاین برای همیشه تغییر کرد. پیش از آن لحظه، تجربه یک بازی مبارزه‌ای با بازیکنی در آن سر دنیا به معنای پذیرش واقعیتی کند و زیرآب‌مانند بود؛ جایی که هر فشار دکمه به طور مصنوعی به تاخیر می‌افتاد تا شبکه خودش را برساند. اما امروز، در همان لحظه‌ای که بازیکن دکمه‌ای را در یک مسابقه بین‌قاره‌ای فشار می‌دهد، بازی دیگر منتظر نمی‌ماند. بازی آینده را پیش‌بینی می‌کند.[2]

در اتمسفر پرالتهاب بازی‌های مبارزه‌ای رقابتی، یک تک‌فریم—تقریباً ۱۶.۵ میلی‌ثانیه در نرخ ۶۰ فریم بر ثانیه—می‌تواند مرز باریک بین دفاع موفق و خوردن یک کمبوی ویرانگر باشد. دهه‌ها، توسعه‌دهندگان به معماری «قفل‌قدم» (Lockstep) متکی بودند؛ جایی که هر دو کلاینت یک وضعیت شبیه‌سازی قطعی را به اشتراک می‌گذاشتند و پیش از پیشروی، ورودی‌ها را تبادل می‌کردند. اگر شبکه ۱۰۰ میلی‌ثانیه زمان می‌برد تا حرکت حریف را برساند، بازی محلی به سادگی فریز می‌شد یا تاخیر ورودی معادلی را اعمال می‌کرد و تمام آن حافظه عضلانی که بازیکنان با هزاران ساعت تمرین آفلاین ساخته بودند را به باد می‌داد.[3][4]

نت‌کد رول‌بک این پارادایم را کاملاً زیر و رو می‌کند. این سیستم به جای ارائه ثبات بی‌نقص به قیمت تاخیر ورودی، پاسخی آنی را به قیمت از دست دادن ثبات لحظه‌ای ارائه می‌دهد. وقتی بازیکن محلی دستوری را وارد می‌کند، کاراکتر او بلافاصله آن را روی صفحه اجرا می‌کند. موتور بازی برای رسیدن داده‌های بازیکن مقابل از طریق اینترنت، ثانیه‌ای درنگ نمی‌کند.[1]

برای اینکه جریان شبیه‌سازی متوقف نشود، کلاینت محلی یک حدس حساب‌شده درباره حرکت حریف می‌زند. از آنجا که زمان واکنش انسان در مقایسه با سرعت پردازنده‌ها نسبتاً کند است، دقیق‌ترین پیش‌بینی آماری معمولاً ساده‌ترینِ آن‌هاست: حریف احتمالاً در حال انجام همان کاری است که کسری از ثانیه پیش انجام می‌داد.[2]

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

اگر بازیکن مقابل در فریم ۱۰ دکمه دفاع را نگه داشته بود، موتور رول‌بک فرض می‌کند که او در فریم‌های ۱۱، ۱۲ و ۱۳ نیز همچنان در حال دفاع است. بازی این فریم‌های پیش‌بینی‌شده را در لحظه رندر کرده و تاخیر شبکه را کاملاً پنهان می‌کند. برای پنجره‌های پیش‌بینی کوتاه—معمولاً زیر ۱۰۰ میلی‌ثانیه—این مدل پیش‌بینی ساده، نرخ دقت فوق‌العاده بالایی دارد.[3]

اما وقتی این پیش‌بینی غلط از آب دربیاید، ریسک ماجرا به شدت بالا می‌رود. اگر بازیکن مقابل در واقع دفاع را رها کرده و در فریم ۱۱ حمله‌ای را آغاز کرده باشد، کلاینت محلی تا زمانی که بسته داده‌ها در فریم ۱۴ به دستش نرسد، از آن بی‌خبر خواهد بود. دقیقاً در همین لحظه، شبیه‌سازی محلی رسماً از واقعیت خارج شده و همگام‌سازی خود را از دست می‌دهد.[1]

اینجاست که مکانیزم «رول‌بک» مانور حیاتی خود را اجرا می‌کند. موتور بازی باید فوراً شبیه‌سازی فعلی را متوقف کند، کل وضعیت بازی را به فریم ۱۰—آخرین لحظه تاییدشده‌ای که ورودی‌های هر دو بازیکن مشخص بود—به عقب برگرداند و تایم‌لاین را اصلاح کند.[5]

سپس ورودی جدید و صحیح فریم ۱۱ را اعمال کرده و با سرعتی سرسام‌آور، شبیه‌سازی را به فریم ۱۴ فست‌فاروارد می‌کند. تمام این فرآیند—به عقب برگشتن، اعمال مجدد ورودی‌ها و شبیه‌سازی دوباره چندین فریم از فیزیک، تشخیص برخورد و منطق بازی—باید کاملاً نامرئی و پیش از آنکه مانیتور فریم بعدی را روی صفحه بکشد، انجام شود.[2]

برای پوشش دادن یک لگ اسپایک ۱۰۰ میلی‌ثانیه‌ای، پردازنده باید فیزیک شش فریم را در زمانی که معمولاً به یک فریم اختصاص دارد، محاسبه کند.
سپس ورودی جدید و صحیح فریم ۱۱ را اعمال کرده و با سرعتی سرسام‌آور، شبیه‌سازی را به فریم ۱۴ فست‌فاروارد می‌کند.

از نظر بصری، بازیکن محلی ممکن است یک پرش جزئی ببیند: انیمیشن حریف چند فریم اولیه را جا می‌اندازد، یا کاراکتر ناگهان به موقعیت جدیدی منتقل می‌شود. اما ورودی‌های خود بازیکن کاملاً دست‌نخورده باقی می‌مانند و آن زمان‌بندی آفلاینی که برای یکپارچگی رقابت حیاتی است، حفظ می‌شود.[3][4]

هزینه مهندسی این توهمِ بی‌نقص، سرسام‌آور است. یک بازی مبارزه‌ای استاندارد که با نرخ ۶۰ فریم بر ثانیه اجرا می‌شود، به پردازنده تنها ۱۶.۶۶ میلی‌ثانیه زمان می‌دهد تا فیزیک را محاسبه کند، ورودی‌ها را پردازش کند و گرافیک یک تک‌فریم را رندر کند. در سیستم قفل‌قدم، موتور بازی همیشه فقط یک فریم را در لحظه محاسبه می‌کند.[1]

نت‌کد رول‌بک این بودجه زمانی را در هم می‌شکند. اگر بازی برای پوشش دادن یک لگ اسپایک ۱۰۰ میلی‌ثانیه‌ای نیاز به رول‌بک و شبیه‌سازی مجدد شش فریم داشته باشد، باید منطق شش فریم را دقیقاً در همان پنجره ۱۶.۶۶ میلی‌ثانیه‌ای محاسبه کند.[6]

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

مدل ساده «تکرار آخرین ورودی» برای پنجره‌های تاخیر کوتاه بسیار دقیق است، اما در تاخیرهای طولانی‌تر به شدت افت می‌کند.

برای جان به در بردن از این وضعیت، وضعیت بازی باید کاملاً قطعی (Deterministic) و قابل سریال‌سازی باشد. تک‌تک متغیرها—از مختصات کاراکترها گرفته تا سیدهای تولید اعداد تصادفی برای افکت‌های ذرات—باید قابلیت ذخیره و بازیابی فوری داشته باشند. اگر یک محاسبه ممیز شناور در دو کلاینت متفاوت حل شود، شبیه‌سازی‌ها برای همیشه از هم جدا شده و یک قطع همگام‌سازی (Desync) مرگبار رخ می‌دهد.[5][6]

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

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

با بهبود زیرساخت‌های اینترنت، معماری زیربنایی نت‌کد رول‌بک در حال نفوذ به سایر ژانرهاست. بازی‌های کوآپ پرسرعت و عناوین رقابتی ترکیبی، به طور فزاینده‌ای در حال پذیرش پیش‌بینی سمت کلاینت و شبیه‌سازی مجدد برای پنهان کردن بی‌ثباتی شبکه هستند. آن ساعت نامرئی که پشت هر فشار دکمه تیک‌تاک می‌کند، دیگر فقط یک مکانیزم مختص بازی‌های مبارزه‌ای نیست؛ بلکه نقشه راه آینده بازی‌های آنلاین است.[3]

نکات کلیدی

  1. نت‌کد رول‌بک با پیش‌بینی حرکات حریف و اجرای فوری دستورات بازیکن محلی، تاخیر ورودی در بازی‌های آنلاین را کاملاً از بین می‌برد.
  2. اگر پیش‌بینی اشتباه باشد، موتور بازی در کسری از ثانیه وضعیت را به عقب برگردانده و با ورودی‌های صحیح، بازی را به جلو فست‌فاروارد می‌کند.
  3. این معماری نیازمند آن است که بازی، فیزیک و منطق چندین فریم را تنها در یک پنجره رندر ۱۶.۶۶ میلی‌ثانیه‌ای پردازش کند.
  4. قطعیت مطلق در این سیستم الزامی است؛ کوچک‌ترین تفاوت در نحوه محاسبه ریاضیات بین دو کامپیوتر، باعث قطع همگام‌سازی دائمی مسابقه می‌شود.
  5. این سیستم حافظه عضلانی بازیکنان رقابتی را که در حالت آفلاین شکل گرفته حفظ می‌کند و باعث می‌شود مسابقات بین‌قاره‌ای هیچ تفاوتی با بازی‌های لوکال نداشته باشند.

بررسی عمیق دیدگاه‌ها

مهندسان شبکه

اولویت آن‌ها شبیه‌سازی قطعی و سریال‌سازی کارآمد وضعیت بازی برای جلوگیری از قطع همگام‌سازی (Desync) است.

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

بازیکنان رقابتی

حفظ حافظه عضلانی آفلاین را بسیار ارزشمندتر از ثبات بصری می‌دانند.

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

توسعه‌دهندگان موتور بازی

برای تطبیق با شبیه‌سازی مجدد و سریع وضعیت بازی، با محدودیت‌های شدید بودجه پردازنده روبرو هستند.

توسعه‌دهندگان موتور بازی باید هسته اصلی بازی را بهینه‌سازی کنند تا از «مارپیچ مرگ» جان سالم به در ببرند. وقتی یک رول‌بک رخ می‌دهد، موتور ممکن است نیاز داشته باشد فیزیک، برخورد و منطق شش فریم یا بیشتر را دقیقاً در همان پنجره ۱۶.۶۶ میلی‌ثانیه‌ای که معمولاً به یک فریم اختصاص دارد، محاسبه کند. این امر نیازمند بهینه‌سازی تهاجمی است و اغلب توسعه‌دهندگان را مجبور می‌کند تا تعاملات پیچیده فیزیک را حذف کرده یا تعداد اشیاء فعال روی صفحه را محدود کنند. بودجه پردازنده برای یک تیک شبیه‌سازی از ۱۶ میلی‌ثانیه به زیر ۳ میلی‌ثانیه کاهش می‌یابد و نحوه کدنویسی سیستم‌های زیربنایی بازی را به طور بنیادین تغییر می‌دهد.

چرا مهم است

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

منابع

پوشش منابع

6 منبع

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

مهندسان شبکه 40%بازیکنان رقابتی 30%توسعه‌دهندگان موتور بازی 30%
  1. [1]SnapNetمهندسان شبکه

    Netcode Architectures Part 2: Rollback

    مطالعه در SnapNet
  2. [2]GGPOمهندسان شبکه

    GGPO | Rollback Networking SDK for Peer-to-Peer Games

    مطالعه در GGPO
  3. [3]Wikipediaبازیکنان رقابتی

    Netcode

    مطالعه در Wikipedia
  4. [4]Infil's Fighting Game Glossaryبازیکنان رقابتی

    Rollback Netcode - The Fighting Game Glossary

    مطالعه در Infil's Fighting Game Glossary
  5. [5]Game Developerتوسعه‌دهندگان موتور بازی

    Lockstep and Rollback

    مطالعه در Game Developer
  6. [6]تیم سردبیری کوهستانتوسعه‌دهندگان موتور بازی

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

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

نظرات

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

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

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