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

نبرد اشیاء در برابر پیکسل‌ها: چگونه رندرینگ Forward و Deferred سرنوشت عملکرد بازی را رقم می‌زنند

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

به قلم قاسم طباطبایی

مدافعان رندرینگ Deferred 60%مدافعان رندرینگ Forward 40%
مدافعان رندرینگ Deferred
نورپردازی پویای نامحدود و جداسازی پیچیدگی هندسی را برای صحنه‌های عظیم در اولویت قرار می‌دهند.
مدافعان رندرینگ Forward
بهره‌وری پهنای باند حافظه، آنتی‌الایزینگ سخت‌افزاری و پشتیبانی از متریال‌های پیچیده را در اولویت قرار می‌دهند.

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

  • معماران سخت‌افزاری که سلسله‌مراتب کش GPU را طراحی می‌کنند
  • توسعه‌دهندگان موتورهای بازی‌سازی که در حال ساخت رندرهای هیبریدی Forward خوشه‌ای (Clustered) هستند

تولیدکنندگان سخت‌افزار مدام پردازنده‌های گرافیکی جدیدشان را با این وعده می‌فروشند که قدرت پردازشی خام بالاخره محدودیت‌های نورپردازی را در هم شکسته است؛ وعده‌ای که به توسعه‌دهندگان القا می‌کند می‌توانند بی‌نهایت نور پویا را بدون هیچ عواقبی در صحنه رها کنند. اما واقعیت ریاضیاتی موتورهای بازی‌سازی مستقیماً این ادعا را نقض می‌کند. همان‌طور که در مستندات LearnOpenGL آمده است، پایپ‌لاین سنتی رندرینگ Forward نورپردازی را با پیچیدگی O(اشیاء × نورها) محاسبه می‌کند. اگر صحنه‌ای شامل ۱۰۰۰ شیء و ۱۰۰ نور باشد، GPU باید ۱۰۰٬۰۰۰ محاسبه نوری انجام دهد، حتی برای اشیایی که پشت یک دیوار پنهان شده‌اند. پرتاب کردن یک پردازنده گرافیکی سریع‌تر به سمت این معادله، این حقیقت را تغییر نمی‌دهد که ریاضیات به شکل نمایی رشد می‌کند؛ و دقیقاً به همین دلیل است که مسیرهای استاندارد رندرینگ Forward در موتورهایی مثل Unity از نظر تاریخی تعداد نورهای پویا را به ۴ تا ۸ نور برای هر شیء محدود می‌کردند.[1][2]

برای در هم شکستن این سقف سخت، صنعت بازی‌سازی زمین بازی را به سمت یک گلوگاه سخت‌افزاری کاملاً متفاوت تغییر داد: پهنای باند حافظه. سایه‌زنی Deferred (به تعویق‌افتاده)، همان‌طور که در مستندات جامعه توسعه‌دهندگان Valve به تفصیل شرح داده شده، فرآیند رندرینگ را به دو مرحله کاملاً مجزا تقسیم می‌کند. در مرحله اول، موتور بازی هندسه صحنه را بدون هیچ‌گونه نورپردازی رندر می‌کند و داده‌هایی مانند عمق، نرمال‌ها و رنگ را در یک مجموعه تکسچر عظیم به نام G-buffer ذخیره می‌کند. در مرحله دوم، موتور بازی نورپردازی را تنها با استفاده از پیکسل‌های قابل مشاهده روی صفحه محاسبه می‌کند. در اینجا پیچیدگی محاسباتی به O(پیکسل‌ها × نورها) سقوط می‌کند و هزینه نورپردازی را به طور کامل از تراکم هندسی صحنه جدا می‌سازد.[4][5][6]

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

اما این جداسازی، یک مالیات سنگین و غیرقابل اجتناب را بر حافظه GPU تحمیل می‌کند. یک G-buffer استاندارد برای هر تک‌پیکسل روی صفحه به ۱۶۰ تا ۲۵۶ بیت داده نیاز دارد. در رزولوشن 1080p، این حجم قابل مدیریت است. اما در رزولوشن 4K، G-buffer به صدها مگابایت داده متورم می‌شود که باید در هر فریم نوشته و خوانده شود؛ اتفاقی که گذرگاه حافظه را پیش از محاسبه حتی یک نور، کاملاً اشباع می‌کند. این دقیقاً همان بده‌بستان عملکردی است که در انجمن‌های تخصصی Computer Graphics Stack Exchange بر سر آن بحث می‌شود: رندرینگ Deferred پیچیدگی محاسباتی را با پهنای باند حافظه معامله می‌کند و رزولوشن‌های بالا را به شکلی نامتناسب گران و پرهزینه می‌سازد.[3][6]

خطرات این بده‌بستان دیکته می‌کند که یک بازی واقعاً چه چیزی را می‌تواند روی صفحه نشان دهد. از آنجا که رندرینگ Deferred نور را بر اساس داده‌های نهایی و دوبعدی پیکسل‌ها در G-buffer محاسبه می‌کند، از اساس متریال‌های شفاف را در هم می‌شکند. یک پنجره شیشه‌ای و دیواری که پشت آن قرار دارد نمی‌توانند به طور همزمان یک پیکسل واحد را در G-buffer اشغال کنند. در نتیجه، موتورهایی مانند Unreal مجبورند متریال‌های شفاف را از طریق یک مسیر جداگانه و پرهزینه رندرینگ Forward که روی صحنه Deferred لایه‌بندی می‌شود پردازش کنند؛ کاری که عملاً GPU را برای یک فضای یکسان از صفحه نمایش، دو بار جریمه می‌کند.[1][5]

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

آنتی‌الایزینگ (Anti-aliasing) نیز به سرنوشت مشابهی دچار می‌شود. آنتی‌الایزینگ چندنمونه‌ای سخت‌افزاری (MSAA) با رندرینگ Forward بی‌نقص کار می‌کند، زیرا GPU هنگام رسم هر شیء، لبه‌های هندسی دقیق آن را می‌شناسد. اما در یک پایپ‌لاین Deferred، این لبه‌های هندسی پیش از اعمال نورپردازی در G-buffer تخت می‌شوند. اعمال MSAA روی یک رندرکننده Deferred نیازمند راهکارهای پیچیده‌ای است که عملکرد را به شدت نابود می‌کند و صنعت را مجبور می‌سازد به سمت راه‌حل‌های پس‌پردازشی مانند آنتی‌الایزینگ زمانی (TAA) برود؛ همان چیزی که باعث ایجاد سایه (Ghosting) و تاری در تصویر می‌شود و بازیکنان رقابتی از آن متنفرند.[7][8]

به همین دلیل است که مسیر رندرینگ، پلتفرم را تعیین می‌کند. واقعیت مجازی (VR) نیازمند رزولوشن‌های فوق‌العاده بالا و کمترین میزان تاخیر مطلق است، که همین امر پهنای باند سنگین حافظه و مشکلات آنتی‌الایزینگ در رندرینگ Deferred را به یک گزینه غیرممکن تبدیل می‌کند. در نتیجه، توسعه‌دهندگان VR تقریباً به طور انحصاری به پایپ‌لاین‌های بهینه‌شده رندرینگ Forward تکیه می‌کنند. در نقطه مقابل، بازی‌های عظیم جهان‌باز با چرخه‌های شبانه‌روز و صدها منبع نور پویا نمی‌توانند از زیر بار ریاضیات O(اشیاء × نورها) در رندرینگ Forward جان سالم به در ببرند، و اینجاست که مالیات G-buffer در Deferred به یک هزینه اجباری برای ادامه کار تبدیل می‌شود.[4][8]

رندرینگ Deferred پیش از اعمال هرگونه محاسبه نوری، داده‌های صحنه را در یک G-buffer تخت و مسطح می‌کند.

موتورهای مدرن در تلاشند تا این شکاف را از طریق رندرینگ Forward خوشه‌ای (Clustered) و کاشی‌کاری‌شده (Tiled) پر کنند؛ روشی که صفحه را به یک شبکه تقسیم کرده و نورهایی را که روی کاشی‌های خاص تاثیری ندارند حذف می‌کند. این رویکرد هیبریدی، قابلیت «نورهای بی‌نهایت» در رندرینگ Deferred را به پایپ‌لاین Forward بازمی‌گرداند و آنتی‌الایزینگ سخت‌افزاری و متریال‌های شفاف را احیا می‌کند. با این حال، فیزیک بنیادین GPU دست‌نخورده باقی می‌ماند: هر فریم یک بودجه‌بندی سخت‌گیرانه از چرخه‌های پردازشی در برابر پهنای باند حافظه است و توسعه‌دهندگان باید انتخاب کنند که حاضرند کدام منبع را تا مرز نابودی مصرف کنند.[7][8]

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

چرا مهم است

هر فداکاری بصری در یک بازی مدرن (از لبه‌های لرزان گرفته تا انعکاس‌های گمشده روی شیشه) ریشه در محدودیت‌های ریاضیاتی موتور بازی در محاسبه نور دارد. درک این بده‌بستان نشان می‌دهد چرا بازی‌ای که روی رزولوشن 1440p مثل کره اجرا می‌شود، ناگهان در 4K به پت‌پت می‌افتد و چرا عناوین واقعیت مجازی (VR) از اساس با نسخه‌های دسکتاپ تفاوت ظاهری دارند.

نکات کلیدی

  • رندرینگ Forward نورپردازی را برای هر شیء محاسبه می‌کند، که با افزایش تعداد نورهای پویا باعث افت نمایی عملکرد می‌شود.
  • رندرینگ Deferred نورپردازی را برای هر پیکسل محاسبه می‌کند و اجازه می‌دهد تعداد عظیمی از نورهای پویا با یک هزینه پردازشی ثابت پردازش شوند.
  • جی‌بافر (G-buffer) مورد نیاز برای رندرینگ Deferred پهنای باند حافظه عظیمی را می‌بلعد و در رزولوشن 4K به شدت افت عملکرد پیدا می‌کند.
  • پایپ‌لاین‌های Deferred از اساس با متریال‌های شفاف و آنتی‌الایزینگ سخت‌افزاری مشکل دارند و توسعه‌دهندگان را مجبور به استفاده از راهکارهای جایگزین و پرهزینه می‌کنند.
  • توسعه‌دهندگان واقعیت مجازی و موبایل به شدت به رندرینگ Forward متکی هستند تا پهنای باند حافظه را حفظ کرده و نرخ فریم بالایی ارائه دهند.

منابع

پوشش منابع

9 منبع

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

مدافعان رندرینگ Deferred 60%مدافعان رندرینگ Forward 40%
  1. [1]LearnOpenGLمدافعان رندرینگ Deferred

    Deferred Shading

    مطالعه در LearnOpenGL
  2. [2]Unity

    Rendering paths in Unity

    مطالعه در Unity
  3. [3]Computer Graphics Stack Exchange

    What is the performance tradeoff between forward and deferred rendering?

    مطالعه در Computer Graphics Stack Exchange
  4. [4]Valve Developer Communityمدافعان رندرینگ Deferred

    Deferred renderer (shading & lighting)

    مطالعه در Valve Developer Community
  5. [5]Unreal Art Optimizationمدافعان رندرینگ Deferred

    Forward vs Deferred Shading

    مطالعه در Unreal Art Optimization
  6. [6]Mighty Professional Tutorials

    Deferred Rendering & the G-buffer

    مطالعه در Mighty Professional Tutorials
  7. [7]Bugnet Blogمدافعان رندرینگ Forward

    Forward vs Deferred Rendering: Which Should You Use

    مطالعه در Bugnet Blog
  8. [8]GDC Vaultمدافعان رندرینگ Forward

    Forward Rendering Pipeline for Modern GPUs

    مطالعه در GDC Vault
  9. [9]تیم سردبیری کوهستان

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

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

نظرات

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

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

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