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

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

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

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

به‌طور خلاصه

  1. نت‌کد رول‌بک با پیش‌بینی حرکات حریف و اجرای فوری دستورات بازیکن محلی، تاخیر ورودی در بازی‌های آنلاین را کاملاً از بین می‌برد.
  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]

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

رول‌بک (Rollback)
یک تکنیک شبکه‌ای که ورودی‌های بازیکن مقابل را پیش‌بینی می‌کند تا تاخیر ورودی محلی را از بین ببرد و در صورت اشتباه بودن پیش‌بینی، وضعیت بازی را به عقب برگردانده و اصلاح می‌کند.
معماری قفل‌قدم (Lockstep Architecture)
یک مدل شبکه‌ای که در آن تمام کلاینت‌ها باید ورودی هر بازیکن را برای یک فریم مشخص دریافت کنند تا شبیه‌سازی بتواند به جلو برود.
قطعیت (Determinism)
یک اصل برنامه‌نویسی که تضمین می‌کند ورودی‌های یکسان همیشه وضعیت بازی کاملاً یکسانی را در کامپیوترهای مختلف تولید می‌کنند.
قطع همگام‌سازی (Desync)
یک خطای مهلک که در آن دو کلاینت متصل، نتایج متفاوتی را برای یک رویداد محاسبه می‌کنند و باعث می‌شوند وضعیت بازی آن‌ها برای همیشه از هم جدا شود.
پیش‌بینی سمت کلاینت (Client-Side Prediction)
فرآیندی که در آن کلاینت بازی محلی پیش از دریافت داده‌های واقعی بازیکن مقابل از طریق شبکه، حدس می‌زند که او در حال انجام چه کاری است.

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

تفاوت بین نت‌کد رول‌بک و نت‌کد مبتنی بر تاخیر چیست؟

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

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

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

آیا می‌توان نت‌کد رول‌بک را به بازی‌های قدیمی اضافه کرد؟

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

آیا نت‌کد رول‌بک برای بازی‌هایی غیر از بازی‌های مبارزه‌ای هم کار می‌کند؟

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

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

مهندسان شبکه

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

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

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

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

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

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

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

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

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

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

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

منابع

پوشش منابع

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]تیم سردبیری کوهستانتوسعه‌دهندگان موتور بازی

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

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

نظرات

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

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

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