بهینه سازی Godot Engine Vulkan برای اندروید

تصویر طلسم موتور گودو

نمای کلی

Godot Engine یک موتور بازی متن باز چند پلتفرمی محبوب با پشتیبانی قوی از اندروید است. گودو را می توان برای ساخت بازی های تقریباً هر سبکی استفاده کرد و قادر به گرافیک دو بعدی و سه بعدی است. گودو نسخه 4 سیستم رندر جدیدی را با ویژگی های پیشرفته برای گرافیک با کیفیت بالا معرفی کرد. رندر Godot 4 برای APIهای گرافیکی مدرن مانند Vulkan طراحی شده است.

بنیاد گودو با کارشناسان بهینه‌سازی گرافیک در The Forge Interactive همکاری کرد و با Google همکاری کرد تا رندر Godot 4 Vulkan را تجزیه و تحلیل و بهبود بخشد و آن بهینه‌سازی‌ها را دوباره در مخزن پروژه ادغام کند. بهینه سازی ها به توسعه دهندگان کمک می کند تا رندرهای سفارشی Vulkan را در اندروید بهبود بخشند.

روش شناسی و نتایج بهینه سازی

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

چندین معماری محبوب GPU اندروید در آزمایش استفاده شد. در حالی که بسیاری از بهینه‌سازی‌ها پیشرفت‌های کلی را به همراه داشتند، برخی از بهینه‌سازی‌ها تأثیر بیشتری بر معماری‌های GPU خاص داشتند. مجموع کل کارهای بهینه سازی منجر به کاهش کلی 10% -20% در زمان فریم GPU شد.

بهینه سازی عمومی ولکان

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

پشتیبانی پویا افست UBO

هنگام اتصال یک مجموعه توصیفگر که حاوی یک شی بافر یکنواخت پویا (UBO) است، Vulkan اجازه می دهد تا افست پویا در UBO در پارامترهای bind مشخص شود. این ویژگی می‌تواند برای بسته‌بندی داده‌ها برای عملیات‌های رندر متعدد در یک UBO منفرد استفاده شود، و مجموعه توصیف‌گر را با یک افست دینامیکی متفاوت برای انتخاب داده‌های مناسب برای سایه‌زن مجدداً پیوند می‌دهد. رندر Godot Vulkan به‌روزرسانی شد تا بتواند از آفست‌های پویا استفاده کند به‌جای اینکه همیشه آفست را صفر کند. این بهبود بهینه سازی کارایی آینده را امکان پذیر می کند.

مجموعه توصیفگر خطی استخر

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

در صورت امکان، مجموعه‌های توصیفگر اکنون به صورت مجموعه‌های خطی بدون تنظیم VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT ایجاد می‌شوند. استخرهای خطی سپس در صورت نیاز به طور کلی تنظیم مجدد می شوند. این کار همچنین شامل بهینه‌سازی اضافی برای اتصال مجموعه توصیفگر دسته‌ای در صورت امکان، کاهش تعداد تماس‌های مجزا به vkCmdBindDescriptorSets() می‌شود.

پشتیبانی غیرقابل تغییر نمونه

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

نمونه‌گرهای تغییرناپذیر انعطاف‌پذیری را با عدم نیاز به مدیریت و اتصال اشیاء نمونه‌گر گسسته عوض می‌کنند. رندر Godot Vulkan برای پشتیبانی از استفاده از سمپلرهای تغییرناپذیر به روز شد. استفاده از نمونه‌برها برای استفاده از نمونه‌گرهای تغییرناپذیر در صورت عملی تغییر یافت.

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

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

بهینه سازی ها عبارتند از:

  • استفاده از ثابت های فشار بزرگ را جایگزین کنید
  • تخصیص بافر تنبل
  • پشتیبانی بافر دائمی
  • تغییر حالت رمزگشایی ASTC
  • پیش چرخش صفحه نمایش

استفاده از ثابت های فشار بزرگ را جایگزین کنید

ثابت های فشاری یک ویژگی است که اجازه می دهد مقادیر ثابت برای برنامه سایه زن فعال به بافر فرمان تزریق شود. ثابت های فشاری راحت هستند زیرا نیازی به ایجاد بافر و جمعیت ندارند و به توصیفگرها گره نمی خورند. با این حال، ثابت های فشار حداکثر اندازه محدودی دارند و می توانند بر عملکرد سخت افزار موبایل تأثیر منفی بگذارند.

در طول آزمایش بر روی دستگاه‌های اندرویدی، عملکرد با جایگزینی استفاده ثابت فشار بیش از 16 بایت با بافرهای یکنواخت بهبود یافت. سایه بان هایی که از 16 بایت یا کمتر از داده های ثابت استفاده می کردند با ثابت های فشاری عملکرد بیشتری داشتند. علاوه بر ملاحظات عملکرد، برخی از سخت‌افزارهای گرافیکی دارای حداقل تراز ۶۴ بایتی برای بافرهای یکنواخت هستند که در مقایسه با استفاده از ثابت‌های فشار، کارایی حافظه را به دلیل استفاده‌نشده از padding کاهش می‌دهد.

تخصیص بافر تنبل

اکثر سخت افزارهای گرافیکی موبایل از معماری رندر معوق مبتنی بر کاشی (TBDR) استفاده می کنند. پردازنده‌های گرافیکی که از TBDR استفاده می‌کنند، منطقه بزرگ‌تر صفحه را به شبکه‌ای از کاشی‌های کوچک‌تر تقسیم می‌کنند و بر اساس هر کاشی رندر می‌کنند. هر کاشی توسط مقدار کمی از RAM پرسرعت پشتیبانی می شود که برای ذخیره سازی توسط GPU هنگامی که GPU یک کاشی را ارائه می دهد استفاده می شود. با TBDR، اهداف رندری که هرگز توسط هدف دیگری خارج از رندر پاس خود نمونه‌برداری نمی‌شوند، می‌توانند به طور موثر در حافظه RAM باقی بمانند و نیازی به بافر برای ذخیره پشتیبان حافظه اصلی ندارند.

VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT در طول ایجاد اهداف رندر مناسب، مانند اهداف رنگی و عمقی اصلی، اضافه شد تا از تخصیص حافظه بافری که هرگز استفاده نمی شود، جلوگیری شود. صرفه جویی در حافظه تخصیص تنبل در صحنه های نمونه به اندازه 50 مگابایت RAM اندازه گیری شد.

پشتیبانی بافر دائمی

سخت افزار موبایل به جای تمایز سخت افزاری بین رم اصلی و رم گرافیکی، از معماری حافظه یکپارچه (UMA) استفاده می کند. وقتی رم اصلی و رم گرافیکی از هم جدا هستند، داده ها باید از رم اصلی به رم گرافیکی منتقل شوند تا توسط GPU استفاده شود. گودو در حال حاضر این فرآیند انتقال را در رندر Vulkan خود با استفاده از بافرهای مرحله‌بندی پیاده‌سازی کرده است. در سخت افزار UMA، یک بافر مرحله بندی برای بسیاری از انواع داده ها غیر ضروری است. حافظه می تواند توسط هر دو CPU و GPU استفاده شود. Forge برای حذف مرحله‌بندی در صورت امکان، پشتیبانی از بافرهای مشترک دائمی را روی سخت‌افزار پشتیبانی‌شده پیاده‌سازی کرد.

تصاویر صحنه گودو که اطلاعات پروفایل را با و نمایش می دهد         بدون بافرهای دائمی فعال
شکل 1. تعیین تفاوت بین بافرهای دائمی فعال و غیرفعال شده در یک صحنه نمونه.

تغییر حالت رمزگشایی ASTC

فشرده‌سازی بافت مقیاس‌پذیر تطبیقی ​​(ASTC) فرمت فشرده‌سازی بافت مدرن ترجیحی در سخت‌افزار موبایل است. در طول فشرده‌سازی، GPU به‌طور پیش‌فرض ممکن است تکل‌ها را به یک مقدار میانی رمزگشایی کند که دقت بیشتری نسبت به وفاداری بصری لازم است و در نتیجه کارایی بافت‌سازی از بین می‌رود. اگر توسط سخت افزار هدف پشتیبانی می شود، پسوند VK_EXT_astc_decode_mode برای تعیین مقادیر غیرعادی 8 بیتی برای هر مؤلفه در هنگام رمزگشایی به جای مقادیر ممیز شناور 16 بیتی استفاده می شود.

پیش چرخش صفحه نمایش

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

بهبود اشکال زدایی

علاوه بر بهینه سازی عملکرد، The Forge تجربه اشکال زدایی مشکلات گرافیکی در رندر گودو را با اضافات زیر بهبود بخشید:

  • پسوند خطای دستگاه
  • خرده نان
  • نشانگرهای اشکال زدایی

پسوند خطای دستگاه

هنگامی که GPU در حین عملیات رندر با مشکلی مواجه می شود، درایور Vulkan می تواند نتیجه VK_ERROR_DEVICE_LOST را از یک تماس Vulkan API برگرداند. به‌طور پیش‌فرض، هیچ اطلاعات زمینه اضافه‌ای مبنی بر اینکه چرا درایور VK_ERROR_DEVICE_LOST برگرداند، ارائه نمی‌شود. پسوند VK_EXT_device_fault مکانیزمی را برای راننده فراهم می کند تا اطلاعات بیشتری در مورد ماهیت خطا ارائه دهد. گودو برای فعال کردن پسوند خطای دستگاه (در صورت موجود بودن) و برای گزارش اطلاعات بازگردانده شده توسط راننده، پشتیبانی اضافه کرد.

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

نشانگرهای اشکال زدایی

نشانگرهای اشکال زدایی، زمانی که توسط درایور پشتیبانی می شوند، برای نامگذاری منابع استفاده می شوند. این اجازه می دهد تا رشته های قابل خواندن توسط کاربر با عملیاتی مانند پاس های رندر و منابعی مانند بافرها و بافت در هنگام استفاده از ابزار گرافیکی مانند RenderDoc مرتبط شوند. پشتیبانی از حاشیه نویسی نشانگر اشکال زدایی به رندر Godot Vulkan اضافه شد.

وبلاگ Godot Engine - به روز رسانی در مورد همکاری با Google و The Forge

درخواست همکاری Godot Engine Vulkan