موتورهای بومی و اختصاصی

با Vulkan در اندروید شروع کنید

Vulkan اولین API گرافیکی سطح پایین در اندروید است. Vulkan عملکرد بهینه ای را برای بازی هایی که موتور بازی و رندر خود را پیاده سازی می کنند ارائه می دهد.

برای اجرای موفقیت آمیز Vulkan در موتور بازی خود باید:

  • مشخص کنید از کدام دستگاه‌های اندرویدی با Vulkan استفاده کنید
  • معاوضه های پشتیبانی از دستگاه های اندرویدی قدیمی را درک کنید
  • Vulkan را به هدف ساخت اندروید خود اضافه کنید
  • یک کامپایلر سایه زن برای ایجاد SPIR-V برای Vulkan انتخاب کنید
  • نسخه Vulkan API موجود در زمان اجرا را تعیین کنید
  • با نحوه بهینه سازی عملیات رندر Vulkan با نمایه های Vulkan، سرعت فریم و پیش چرخش آشنا شوید.
  • ابزارهای گرافیکی را برای اشکال زدایی و تجزیه و تحلیل عملکرد انتخاب کنید

حداقل مشخصات دستگاه را برای Vulkan انتخاب کنید

Vulkan در اندروید با شروع اندروید 7.0 (سطح API 24) در دسترس است. همه دستگاه‌های اندرویدی دارای اندروید ۷.۰ یا بالاتر از Vulkan پشتیبانی نمی‌کنند. باید تعیین کنید که بازی شما از کدام دستگاه‌های اندرویدی با قابلیت Vulkan پشتیبانی می‌کند.

توصیه ها

از مشخصات زیر به عنوان حداقل الزامات پشتیبانی Vulkan استفاده کنید:

  • دستگاه دارای Android 10.0 (سطح API 29) یا بالاتر است
  • دستگاه از Vulkan API نسخه 1.1 یا بالاتر پشتیبانی می کند
  • دستگاه دارای قابلیت‌ها و ویژگی‌های سخت‌افزاری سازگار با نمایه Android Baseline 2022 است

پشتیبانی از دستگاه های قدیمی تر

اگر بازی شما برای اجرا بر روی طیف وسیعی از دستگاه‌ها با سطوح مختلف قابلیت‌های گرافیکی طراحی شده است، ممکن است لازم باشد از دستگاه‌های قدیمی‌تر از موارد توصیه شده در انتخاب حداقل مشخصات دستگاه برای Vulkan پشتیبانی کنید. قبل از ایجاد پشتیبانی برای دستگاه‌های قدیمی، ارزیابی کنید که آیا Vulkan مزایایی را برای بازی شما فراهم می‌کند یا خیر. بازی‌هایی که تماس‌های قرعه‌کشی زیادی دارند و از OpenGL ES استفاده می‌کنند، به دلیل هزینه‌های بالای برقراری تماس‌های قرعه‌کشی در OpenGL ES، می‌توانند هزینه‌های زیادی را مشاهده کنند. این بازی ها می توانند با صرف بخش زیادی از زمان فریم خود در درایور گرافیک، به CPU محدود شوند. بازی ها همچنین می توانند با تغییر از OpenGL ES به Vulkan، کاهش قابل توجهی در مصرف CPU و انرژی داشته باشند. این امر به ویژه در صورتی کاربرد دارد که بازی شما صحنه های پیچیده ای دارد که نمی توانند به طور موثر از نمونه سازی برای کاهش تماس های قرعه کشی استفاده کنند. هنگامی که دستگاه‌های قدیمی‌تر را هدف قرار می‌دهید، پشتیبانی از رندر OpenGL ES را به‌عنوان یک نسخه جایگزین اضافه کنید، زیرا برخی از دستگاه‌های موجود در فهرست دستگاه‌های مورد نظر شما ممکن است پیاده‌سازی‌های Vulkan داشته باشند که نتوانند بازی شما را به‌طور قابل اعتماد اجرا کنند.

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

عملکرد و ویژگی ها

دستگاه‌های Android قدیمی‌تر با قابلیت Vulkan ممکن است عملکرد رندر یا پشتیبانی سخت‌افزاری برای ویژگی‌های مورد نیاز برای اجرای بازی شما نداشته باشند. به خصوص اگر بازی شما دارای گرافیک با کیفیت بالا باشد و Vulkan تنها API باشد که در اندروید هدف قرار داده اید، این امر محتمل است. بسیاری از دستگاه‌های قدیمی‌تر محدود به نسخه 1.0.3 Vulkan API هستند و اغلب افزونه‌های پرکاربرد Vulkan موجود در سخت‌افزار مدرن‌تر را ندارند.

ثبات

دستگاه‌های اندرویدی قدیمی‌تر ممکن است از درایورهای قدیمی Vulkan استفاده کنند. این نسخه‌های درایور ممکن است دارای اشکالاتی باشند که می‌توانند بر پایداری بازی شما تأثیر بگذارند. کار بر روی اشکالات درایور می تواند مقدار قابل توجهی از آزمایش و زمان مهندسی را شامل شود.

Vulkan را به پروژه خود اضافه کنید

برای اضافه کردن Vulkan به پروژه خود باید:

  • شامل سرصفحه های Vulkan API
  • کد سایه زن را به SPIR-V کامپایل کنید
  • در زمان اجرا با Vulkan API تماس بگیرید

شامل سرصفحه های Vulkan API

بازی شما باید شامل فایل‌های هدر Vulkan API برای کامپایل کدی باشد که از Vulkan استفاده می‌کند. می‌توانید نسخه‌ای از سرصفحه‌های Vulkan را در Android NDK یا بسته‌بندی شده در نسخه‌های Vulkan SDK پیدا کنید. هر نسخه NDK خاص فقط شامل سرصفحه های Vulkan در زمان انتشار NDK است. اگر از هدرهای Vulkan از NDK استفاده می‌کنید، از NDK نسخه 25 یا بالاتر استفاده کنید که شامل فایل‌های هدر است که از Vulkan نسخه 1.3 پشتیبانی می‌کنند. Vulkan SDK جدیدترین نسخه هدرها را دارد.

کد سایه زن را به SPIR-V کامپایل کنید

Vulkan API انتظار دارد که برنامه های سایه زن در قالب دودویی میانی SPIR-V ارائه شوند. این قرارداد با OpenGL ES متفاوت است، جایی که می‌توانید کد منبع نوشته شده در زبان سایه‌اندازی OpenGL (GLSL) را به عنوان رشته‌های متنی ارسال کنید. از یک کامپایلر سایه زن برای گرفتن کد نوشته شده به زبان سایه زن مانند GLSL یا زبان سایه بان سطح بالا (HLSL) و کامپایل آن در ماژول های SPIR-V برای استفاده با Vulkan استفاده کنید.

از کامپایلر shaderc می توان برای کامپایل برنامه های سایه زن نوشته شده در GLSL در SPIR-V استفاده کرد. اگر بازی شما از HLSL استفاده می کند، DirectXShaderCompiler از خروجی SPIR-V پشتیبانی می کند. به طور معمول، شما برنامه های سایه زن را به عنوان بخشی از فرآیند ساخت دارایی برای بازی خود به صورت آفلاین کامپایل می کنید و ماژول های SPIR-V را به عنوان بخشی از دارایی های زمان اجرا خود درج می کنید.

در زمان اجرا با Vulkan API تماس بگیرید

برای فراخوانی Vulkan API، بازی شما نیاز به دریافت نشانگرهای تابع برای فراخوانی Vulkan API دارد. ساده ترین راه برای انجام این کار، پیوند با کتابخانه مشترک libvulkan.so است که در Android NDK موجود است. پیوند در برابر کتابخانه دو نقص دارد: سربار ارسال تابع اضافی و محدودیت هایی که نشانگرهای عملکرد API Vulkan به طور خودکار برطرف می شوند.

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

کتابخانه سیستم به طور کلی فقط نشانگرهایی را به توابع Vulkan که بخشی از API اصلی در نظر گرفته می شوند، حل می کند. Vulkan دارای تعداد زیادی افزونه است که توابع اضافی Vulkan را تعریف می کنند، که بسیاری از آنها به طور خودکار توسط کتابخانه سیستم حل نمی شوند. قبل از استفاده از این توابع Vulkan باید اشاره گرها را به صورت دستی حل کنید.

برای کاهش این مشکلات، نشانگرهای تمام عملکردهای Vulkan را که می‌خواهید در زمان اجرا استفاده کنید، به صورت پویا حل کنید. یکی از راه‌های انجام این کار استفاده از یک کتابخانه متا لودر منبع باز مانند Volk است. بازی نمونه AGDKTunnel volk را برای این منظور ادغام می کند. اگر از کتابخانه متا لودر استفاده می کنید، در اسکریپت های ساخت خود به کتابخانه مشترک libvulkan.so لینک ندهید.

نسخه Vulkan API موجود را تعیین کنید

اندروید از نسخه های Vulkan API زیر پشتیبانی می کند:

  • 1.0.3
  • 1.1
  • 1.3

بالاترین شماره نسخه Vulkan API موجود در یک دستگاه خاص توسط نسخه Android و پشتیبانی درایور Vulkan تعیین می شود.

نسخه اندروید

پشتیبانی پلت فرم برای نسخه Vulkan API به حداقل نسخه اندروید (سطح API) بستگی دارد:

  • 1.3 - Android 13.0 (سطح API 33) و بالاتر
  • 1.1 - اندروید 10.0 (سطح API 29) و بالاتر
  • 1.0.3 - اندروید 7.0 (سطح API 24) و بالاتر

پشتیبانی از درایور Vulkan

پشتیبانی پلت فرم اندروید برای نسخه Vulkan API تضمین نمی کند که نسخه API توسط درایور Vulkan دستگاه پشتیبانی شود. دستگاهی که اندروید 13 را اجرا می کند ممکن است فقط از نسخه 1.1 Vulkan API پشتیبانی کند.

هنگام راه اندازی Vulkan، نسخه API بزرگتر از:

  • حداکثر نسخه Vulkan API برای نسخه اندروید در حال اجرا بر روی دستگاه
  • نسخه Vulkan API گزارش شده توسط vkEnumerateInstanceVersion
  • نسخه Vulkan API گزارش شده توسط ویژگی apiVersion ساختار VkPhysicalDeviceProperties

نمونه ای از تعیین بالاترین نسخه Vulkan API پشتیبانی شده به شرح زیر است:

// Minimum Android API levels for Vulkan 1.3/1.1 version support
static constexpr int kMinimum_vk13_api_level = 33;
static constexpr int kMinimum_vk11_api_level = 29;

uint32_t GetHighestSupportedVulkanVersion(VkPhysicalDevice physical_device) {
  uint32_t instance_api_version = 0;
  vkEnumerateInstanceVersion(&instance_api_version);

  VkPhysicalDeviceProperties device_properties;
  vkGetPhysicalDeviceProperties(physical_device, &device_properties);

  // Instance and device versions don't have to match, use the lowest version
  // number for API support if they don't.
  const uint32_t driver_api_version =
      (instance_api_version < device_properties.apiVersion) ?
      instance_api_version : device_properties.apiVersion;

  const int device_api_level = android_get_device_api_level();
  if (device_api_level >= kMinimum_vk13_api_level &&
      driver_api_version >= VK_API_VERSION_1_3) {
    return VK_API_VERSION_1_3;
  } else if (device_api_level >= kMinimum_vk11_api_level &&
             driver_api_version >= VK_API_VERSION_1_1) {
    return VK_API_VERSION_1_1;
  }
  return VK_API_VERSION_1_0;
}

سازگاری پروفایل Vulkan را تعیین کنید

نمایه‌های Vulkan فایل‌های JSON هستند که مجموعه‌ای از ویژگی‌ها، برنامه‌های افزودنی، قابلیت‌ها و حداقل محدودیت‌های پارامتری مورد نیاز را تعریف می‌کنند که یک دستگاه Vulkan باید برای سازگاری با نمایه پشتیبانی کند. برای تعیین اینکه آیا دستگاهی با یک نمایه Vulkan خاص، مانند نمایه Android Baseline 2022 سازگار است یا خیر، از کتابخانه منبع باز Vulkan Profiles API استفاده کنید. همچنین می‌توانید فایل JSON پروفایل را خودتان تجزیه و تحلیل کنید و قابلیت‌های دستگاه را با استفاده از APIهای Vulkan مربوطه برای تعیین سازگاری نمایه بررسی کنید.

پروفایل های Vulkan

اندروید از Vulkan Profiles استفاده می‌کند که مشخص می‌کند کدام ویژگی‌ها و افزونه‌ها برای هر یک از دستگاه‌های دارای Android در دسترس هستند.

نمایه خط پایه اندروید (ABP) اولین تلاش برای ایجاد نمایه Vulkan است. ABP2021 و ABP2022 نمایه‌هایی با ظاهر عقب هستند که هدف آن پوشش بیش از 85 درصد از دستگاه‌های فعال در آن زمان است. هیچ ABP جدیدی در آینده وجود نخواهد داشت.

Vulkan Profiles for Android (VPA) نمایه آینده‌نگر جدیدی است که هدف آن منعکس‌کننده نیازهای توسعه‌دهندگان نرم‌افزار است و به محض اینکه توسعه‌دهندگان سخت‌افزار بتوانند آن‌ها را ارائه دهند، ویژگی‌های ثابتی را ارائه می‌دهد. VPA15_minimums اولین نمایه برای اندروید 15 است و هر سال یک VPA جدید برای پوشش هر نسخه اصلی اندروید وجود خواهد داشت.

پیاده سازی سرعت قاب

تنظیم فریم مناسب بخش ضروری ارائه یک تجربه گیم پلی با کیفیت است. کیت توسعه بازی اندروید شامل کتابخانه Frame Pacing برای کمک به بازی شما برای رسیدن به سرعت فریم بهینه است. برای جزئیات بیشتر پیاده سازی، به ادغام سرعت قاب Android در رندر Vulkan خود مراجعه کنید.

اجرای پیش چرخش

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

عیب یابی و نمایه رندر Vulkan

ابزارهای متعددی برای کمک به شما در تشخیص مشکلات رندرینگ و مشکلات عملکرد با کد رندر Vulkan در دسترس هستند.

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

لایه های اعتبار سنجی Vulkan

لایه‌های اعتبارسنجی Vulkan کتابخانه‌های زمان اجرا هستند که می‌توانند برای بازرسی تماس‌های شما با Vulkan API و ارائه اخطار یا خطا در مورد استفاده نادرست یا غیربهینه فعال شوند. این لایه‌های اعتبارسنجی به‌طور پیش‌فرض فعال نیستند، زیرا فرآیند اعتبارسنجی سربار زمان اجرا را اضافه می‌کند و بر عملکرد بازی شما تأثیر می‌گذارد. برای اطلاعات در مورد نحوه استفاده از لایه‌های اعتبارسنجی با بازی خود، به اشکال‌زدایی با لایه اعتبارسنجی مراجعه کنید.

ابزارهای ضبط فریم

از ابزارهای ضبط فریم برای ضبط و پخش مجدد تماس های Vulkan API که در طول یک فریم بازی گرفته شده است استفاده کنید. این ابزار به شما اجازه می دهد:

  • مشاهده اطلاعات و تجسم منابع گرافیکی فعال
  • دنباله تماس های API انجام شده توسط بازی خود را ببینید و پارامترهای API را ببینید
  • وضعیت خط لوله گرافیکی را در زمان فراخوانی قرعه کشی کاوش کنید
  • نتایج رندر تا یک فراخوانی خاص را در قاب تجسم کنید

از ابزار منبع باز RenderDoc برای گرفتن فریم از بازی های در حال اجرا در اندروید استفاده کنید. RenderDoc از گرفتن فریم از Vulkan و OpenGL ES پشتیبانی می کند.

همچنین می‌توان از Android GPU Inspector (AGI) برای گرفتن فریم‌های Vulkan استفاده کرد.

ابزارهای تحلیل عملکرد

از ابزارهای تجزیه و تحلیل عملکرد برای بررسی مشکلات رندر بازی خود استفاده کنید که باعث نرخ فریم کمتر از حد مطلوب می شود. فروشندگان جداگانه GPU ابزارهایی را ارائه می دهند که برای نمایه بازی شما طراحی شده اند و داده های عملکرد خاص معماری GPU خود را ارائه می دهند. ویژگی های عملکرد و گلوگاه های بازی شما می تواند به طور قابل توجهی در هنگام رندر کردن بر روی پردازنده های گرافیکی از فروشندگان مختلف یا حتی در نسل های مختلف GPU از یک فروشنده متفاوت باشد.

همچنین می توانید از بازرس GPU Android برای جمع آوری و تجزیه و تحلیل داده های عملکرد استفاده کنید. برخلاف ابزارهای فروشنده، Android GPU Inspector با چندین GPU از فروشندگان مختلف سازگار است. با این حال، Android GPU Inspector از دستگاه های اندروید قدیمی پشتیبانی نمی کند و ممکن است با همه دستگاه های جدید سازگار نباشد.

بهبود تست Vulkan با CTS-D

سازندگان دستگاه‌های مجهز به اندروید از مجموعه تست سازگاری (CTS) برای اطمینان از سازگاری دستگاه‌هایشان استفاده می‌کنند. CTS مبتنی بر توسعه‌دهنده (CTS-D) آزمایش‌هایی هستند که توسط توسعه‌دهندگان برنامه‌های اندروید ارسال می‌شوند تا مطمئن شوند که دستگاه‌های اندرویدی آینده موارد استفاده خود را برآورده می‌کنند و می‌توانند برنامه‌های خود را به‌طور روان و بدون اشکال اجرا کنند.

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

برای دستورالعمل های گام به گام در مورد نحوه ارسال پروپوزال آزمون، فرآیند ارسال CTS را بررسی کنید.