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

وقتی جهان‌های مجازی به لرزه می‌افتند؛ راز گم‌شدن اعداد فرد در ۱۶ میلیون واحد

وقتی جهان بازی‌های ویدیویی از مرز ۱۶٫۷ میلیون واحد فراتر می‌رود، محاسبات ممیز شناور ۳۲ بیتی دیگر توانایی شمارش یکی‌یکی اعداد را از دست می‌دهند؛ رویدادی که به لرزش کاراکترها و فروپاشی فیزیک بازی می‌انجامد. موتورهای بازی‌سازی برای حل این بحران ناچارند یا کل کیهان را مدام به نقطه صفر بازگردانند یا به مختصات ۶۴ بیتی روی آورند.

به قلم رسول سرلک

به‌طور خلاصه

  1. موتورهای بازی استاندارد ۳۲ بیتی به محض آنکه جسمی ۱۶٫۷ میلیون واحد از مبدا فاصله بگیرد، دیگر نمی‌توانند مختصات اعداد فرد را ذخیره کنند.
  2. این افت دقت ریاضی مدل‌های سه‌بعدی را مجبور به چسبیدن به اعداد زوج می‌کند که نتیجه‌اش لرزش شدید بصری و فروپاشی محاسبات فیزیک است.
  3. موتورهای نسل جدید نظیر آنریل انجین ۵ با رفتن به سراغ محاسبات ۶۴ بیتی با دقت مضاعف، مقیاس امن نقشه‌ها را به میلیاردها کیلومتر رسانده‌اند.

در آوریل ۲۰۲۲، شرکت اپیک گیمز با انتشار آنریل انجین ۵، شیوه خلق مناظر پهناور دیجیتال را زیرورو کرد و پشتیبانی ذاتی از اعداد ممیز شناور ۶۴ بیتی با دقت مضاعف را در دسترس همگان قرار داد. پیش از این جهش، بازیسازانی که نقشه‌های پهناور جهان‌باز می‌ساختند، دیر یا زود به یک دیوار بتنی در دنیای ریاضیات برمی‌خوردند: درست همان لحظه‌ای که بازیکن بیش از حد از مرکز نقشه دور می‌شد، فیزیک بازی دچار صرعی مهارناپذیر می‌شد و همه‌چیز به لرزه می‌افتاد.[3]

ریشه این زلزله دیجیتال در استانداردی نهفته است به نام ممیز شناور تک‌دقتی IEEE 754. این فرمت ۳۲ بیتی که سال ۱۹۸۵ پایه‌گذاری شد، روش پیش‌فرض رایانه‌ها برای محاسبه اعداد اعشاری است؛ سازوکاری که برای به‌دست‌آوردن سرعت پردازش بالا، بخشی از دقت ریاضی را فدا می‌کند. این معامله تا وقتی محیط‌های مجازی اندازه یک اتاق یا میدان مسابقه باشند بی‌نقص کار می‌کند، اما امان از روزی که مقیاس نقشه به ابعاد واقعی شهرهای پهناور برسد.[1]

در دل یک متغیر ۳۲ بیتی استاندارد، دقیقاً ۲۴ بیت به «مانتیس» اختصاص یافته؛ بخشی که وظیفه نگهداری رقم‌های معنادار عدد را بر دوش دارد. از آنجا که دو به توان ۲۴ دقیقاً برابر با ۱۶٬۷۷۷٬۲۱۶ است، یک عدد ممیز شناور ۳۲ بیتی می‌تواند تمام اعداد صحیح را تا این مرز میلیونی با دقت کامل و میلی‌متری ثبت کند.[1]

اما امان از یک واحد جلوتر رفتن؛ به محض عبور مختصات از ۱۶٬۷۷۷٬۲۱۶، رایانه رسماً دیگر بیت خالی برای شمردن تک‌تک واحدها ندارد. در نتیجه، فاصله میان اعداد قابل نمایش ناگهان از یک به دو می‌پرد. یعنی ماشین حافظه‌ای برای ذخیره عدد ۱۶٬۷۷۷٬۲۱۷ ندارد و آن را به نزدیک‌ترین عدد زوج گرد می‌کند؛ به همین سادگی، تمام اعداد فرد دود می‌شوند و به هوا می‌روند.[1]

دیوار نفوذناپذیر محاسبات ۳۲ بیتی

با بزرگ‌تر شدن اعداد، این افت دقت به شکلی تصاعدی وخیم‌تر می‌شود. از مرز ۳۳٫۵ میلیون که بگذرید، گام‌های پرش به ۴ واحد می‌رسد و در حوالی ۱۳۴ میلیون واحد، موتور بازی‌سازی تنها می‌تواند اجسام را در پرش‌های ۱۶تایی جانمایی کند؛ شکاف‌هایی خالی و برزخی که عملاً هیچ شیء فیزیکی نمی‌تواند در آن‌ها آرام بگیرد.[1]

در دنیای موتورهای بازی، همین معادلات خشک ریاضی تعیین‌کننده فضا روی محورهای سه‌گانه X و Y و Z هستند. یک کاراکتر یا خودرو از هزاران رأس هندسی مجزا تشکیل شده که هرکدام به مختصاتی بسیار دقیق محتاجند. وقتی کاراکتر نزدیک نقطه صفر مختصات پرسه می‌زند، موتور این رأس‌ها را با دقتی مینیاتوری سر جای خود می‌نشاند.[6]

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

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

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

تبدیل خطای ریاضی به لرزش بصری

جالب اینجاست که این فروپاشی ریاضی به دلیل تفاوت در تعریف مقیاس پایه موتورها، در فواصل متفاوتی از دنیای واقعی رخ می‌دهد. در موتور یونیتی، مقیاس پیش‌فرض به‌گونه‌ای است که هر واحد برابر با یک متر فرض می‌شود. با این حساب، یک بازی‌ساز می‌تواند تا ۱۶٬۷۷۷ کیلومتر از مرکز دور شود پیش از آنکه دقت مترهای فرد از دست برود.[2][6]

اما در آنریل انجین ۴، قضیه فرق می‌کرد؛ این موتور بر پایه سانتی‌متر ساخته شده بود، یعنی هر واحد مساوی یک سانتی‌متر. با این حساب، بازیکن در فاصله تنها ۱۶۷٫۷ کیلومتری از مرکز با همان دیوار مرگ ریاضی روبه‌رو می‌شد. برای عناوین مدرن جهان‌باز، نقشه‌ای با وسعت ۱۶۷ کیلومتر اصلاً رویایی دوردست نبود و سازندگان خیلی زود در تنگنا گیر می‌افتادند.[3][6]

برای غلبه بر این بن‌بست هندسی، سازندگان سال‌ها به ترفندی تردستانه پناه بردند که به آن «بازتنظیم مبدا مختصات» یا Origin Rebasing می‌گفتند. در این حقه، موتور به جای اینکه بگذارد بازیکن بی‌انتها از نقطه صفر دور شود، فاصله او را قدم‌به‌قدم زیر نظر می‌گیرد و کل دنیا را مانند یک تردمیل متحرک اداره می‌کند.[5]

موتور یک حباب امن، مثلاً به شعاع پنج کیلومتر، دور نقطه مرکزی جهان (۰،۰،۰) تعریف می‌کند. بازیکن آزادانه در این حباب به گشت‌وگذار می‌پردازد، بی‌خبر از آنکه روی خطوط نامرئی ریاضی قدم می‌زند. اما به محض آنکه نوک پایش از این مرز پنج کیلومتری بیرون می‌زند، موتور با تمام توان وارد عمل می‌شود.[2][5]

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

تردمیل کیهانی؛ حقه بازتنظیم مبدا

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

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

اگرچه این جابه‌جایی مخفیانه مشکل بازی‌های تک‌نفره را حل می‌کرد، اما در بازی‌های چندنفره آنلاین کار را به گره کوری تبدیل می‌کرد. کُد مانکی، بازیساز مستقل، درباره بن‌بست این روش می‌گوید: «اگر بازی شما نیازمند اشیایی باشد که واقعاً از یکدیگر دورند—مثلاً یک سفینه نزدیک زمین و سیاره‌هایی بسیار دوردست در ژرفای فضا—این شعبده‌بازی اصلاً کارساز نیست.»[4]

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

دردسرهای مختصات در بازی‌های چندنفره

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

پایان دادن به این سردرد ساختاری تنها یک راه داشت: کوچ کامل از ممیز شناور ۳۲ بیتی به داده‌های ۶۴ بیتی با دقت مضاعف. با دوبرابر کردن حافظه اشغال‌شده توسط هر مختصات، افق‌های دنیای دیجیتال بازنویسی شدند و مرزهای خطا تا فاصله‌هایی نجومی عقب رانده شدند.[3]

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

یک متغیر ۶۴ بیتی، ۵۳ بیت کامل را برای مانتیس خود کنار می‌گذارد. به جای آنکه در ۱۶٫۷ میلیون واحد شروع به جا انداختن اعداد فرد کند، این فرمت غول‌آسا می‌تواند تک‌تک واحدها را تا مرز باورنکردنی ۹٬۰۰۷٬۱۹۹٬۲۵۴٬۷۴۰٬۹۹۲ با دقت تمام رهگیری کند؛ سقفی که بیش از ۵۳۶ میلیون برابر ارتقا یافته است.[1][6]

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

درمان قطعی با ممیز شناور ۶۴ بیتی

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

البته که این تحول، رم بیشتری می‌طلبد و بار پردازشی را اندکی بالا می‌برد، اما کارت‌های گرافیک و سخت‌افزارهای امروزی برای چنین محاسباتی مهیا هستند و این هزینه را مثل آب خوردن هضم می‌کنند تا محدودیت‌های دست‌وپاگیر ۳۲ بیتی به بایگانی تاریخ بپیوندند.[6]

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

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

این تحلیل چگونه انجام شد

روش
محاسبه آستانه فاصله‌های فیزیکی بروز خطاهای ممیز شناور تک‌دقتی در موتورهای اصلی بازی با تبدیل حد ریاضی ۱۶٬۷۷۷٬۲۱۶ واحد به کیلومتر بر اساس مقیاس‌های پیش‌فرض هر موتور.
یافته
فروپاشی دقت ریاضی بر حسب مقیاس پایه هر موتور در مسافت‌های بسیار متفاوتی پدیدار می‌شود: بازی‌های ساخته‌شده با یونیتی از فاصله ۱۶٬۷۷۷ کیلومتری مبدا با مشکل دقت روبه‌رو می‌شوند، در حالی که در آنریل انجین ۴ به دلیل پایه سانتی‌متری، این دیوار محدودیت در فاصله تنها ۱۶۷٫۷ کیلومتری پدیدار می‌شود و سازندگان را خیلی زودتر وادار به بازتنظیم مبدا می‌کند.
داده‌هایی که بر پایهٔ آن‌ها کار کردیم
  • محدودیت مانتیس تک‌دقتی IEEE 754: 16,777,216 — IEEE
  • مقیاس پایه در یونیتی (۱ متر): 1 meter per unit — Unity Technologies
  • مقیاس پایه در آنریل انجین (۱ سانتی‌متر): 1 centimeter per unit — Epic Games
محدودیت‌های این تحلیل
این محاسبه با فرض استفاده از مقیاس پیش‌فرض موتورها انجام شده و در صورتی که سازندگان از ضرایب سفارشی یا مختصات تو‌در‌تو استفاده کنند، ارقام تغییر خواهند کرد.

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

مانتیس (Mantissa)
بخشی از عدد ممیز شناور که ارقام معنادار را در خود نگه می‌دارد و دقت مطلق ریاضی عدد را معین می‌کند.
لرزش ممیز شناور (Floating-Point Jitter)
یک اشکال بصری که در آن مدل‌های سه‌بعدی به دلیل گرد شدن مختصات به نزدیک‌ترین عدد در دسترس، دچار لرزش شدید یا ازهم‌گسیختگی بافت می‌شوند.
بازتنظیم مبدا مختصات (Origin Rebasing)
ترفندی در برنامه‌نویسی بازی که بازیکن را به مرکز نقشه منتقل کرده و هم‌زمان تمام دنیای بازی را به همان میزان به عقب برمی‌گرداند تا دقت اعداد حفظ شود.
ممیز شناور با دقت مضاعف (Double-Precision Float)
یک نوع داده ۶۴ بیتی که ارقام بااهمیت بسیار بیشتری نسبت به متغیرهای ۳۲ بیتی فراهم کرده و خطاهای ناشی از فاصله در ابعاد فضایی را تقریباً از بین می‌برد.

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

آیا لرزش ممیز شناور در بازی‌های دو‌بعدی هم رخ می‌دهد؟

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

چرا بازی‌های قدیمی از مختصات ۶۴ بیتی استفاده نمی‌کردند؟

در دهه‌های گذشته، محاسبات ۶۴ بیتی پهنای باند حافظه را دوبرابر اشغال می‌کرد و بار سنگینی روی پردازنده‌های ضعیف‌تر دهه‌های ۹۰ و ۲۰۰۰ می‌گذاشت. برای حفظ نرخ فریم روان، ممیز شناور ۳۲ بیتی گزینه‌ای اجتناب‌ناپذیر بود.

آیا بازتنظیم مبدا می‌تواند لود شدن محیط‌های جدید را پنهان کند؟

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

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

طراحان موتورهای بازی

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

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

بازیسازان مستقل

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

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

طراحان موتورهای بازی 60%بازیسازان مستقل 40%
طراحان موتورهای بازی
توسعه‌دهندگان فناوری‌های پایه که پایداری ریاضی بی‌نقص را بر سازگاری با سخت‌افزارهای قدیمی ترجیح می‌دهند.
بازیسازان مستقل
استودیوهای کوچک و توسعه‌دهندگان انفرادی که به دنبال راه‌حل‌های عملی و کم‌هزینه برای اجرای روان بازی روی سخت‌افزارهای ارزان هستند.

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

  • اسپیدرانرهایی که عمداً با دستکاری خطاهای ممیز شناور به آن‌سوی مرزهای تعریف‌شده بازی نفوذ می‌کنند

منابع

پوشش منابع

6 منبع

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

طراحان موتورهای بازی 60%بازیسازان مستقل 40%
  1. [1]IEEEطراحان موتورهای بازی

    IEEE 754-2019 - IEEE Standard for Floating-Point Arithmetic

    مطالعه در IEEE →
  2. [2]Unity Technologiesطراحان موتورهای بازی

    Transforms and Floating Point Precision

    مطالعه در Unity Technologies →
  3. [3]Epic Gamesطراحان موتورهای بازی

    Large World Coordinates in Unreal Engine 5

    مطالعه در Epic Games →
  4. [4]Code Monkeyبازیسازان مستقل

    The Floating Point Problem in Huge Worlds

    مطالعه در Code Monkey →
  5. [5]Manuel Rauberبازیسازان مستقل

    Floating Origin in Unity

    مطالعه در Manuel Rauber →
  6. [6]تیم سردبیری کوهستان

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

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

نظرات

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

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

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