شروع به کار با Vulkan در Android
Vulkan میانای برنامهسازی کاربردی گرافیک سطح پایین اصلی در Android است. Vulkan عملکرد بهینهای برای بازیهایی که موتور بازی و رندرکننده خودشان را پیادهسازی میکنند ارائه میدهد.
برای پیادهسازی موفق Vulkan در موتور بازیتان باید:
- شناسایی دستگاههای Android برای استفاده با Vulkan
- آشنایی با مزایا و معایب پشتیبانی از دستگاههای Android قدیمیتر
- افزودن Vulkan به هدف ساخت Android
- کامپایلر سایهزنی را برای ایجاد SPIR-V برای Vulkan انتخاب کنید
- تعیین نسخه Vulkan API دردسترس در زمان اجرا
- با نحوه بهینهسازی عملیات پردازشی Vulkan با نمایه Vulkan، سرعت فریم، و پیشچرخش آشنا شوید
- انتخاب ابزارهای گرافیکی برای اشکالزدایی و تحلیل عملکرد
- توجه: برای کسب اطلاعات درباره استفاده از Vulkan در Android با موتورهای بازی Unity یا Unreal، به این موارد مراجعه کنید:
- Vulkan در Unity
- Vulkan در Unreal
انتخاب حداقل مشخصات دستگاه برای Vulkan
Vulkan در Android از Android 7.0 (سطح API ۲۴) دردسترس است. همه دستگاههای Android با Android نسخه ۷.۰ یا بالاتر از Vulkan پشتیبانی نمیکنند. باید مشخص کنید بازی شما از کدام دستگاههای Android با قابلیت Vulkan پشتیبانی میکند.
توصیهها
از مشخصات زیر بهعنوان حداقل الزامات برای پشتیبانی از Vulkan استفاده کنید:
- دستگاه Android نسخه ۱۰.۰ (سطح میانای برنامهسازی کاربردی ۲۹) یا بالاتر داشته باشد
- دستگاه از Vulkan API نسخه ۱.۱ یا بالاتر پشتیبانی میکند
- دستگاه دارای قابلیتها و ویژگیهای سختافزاری سازگار با نمایه پایه Android ۲۰۲۲ باشد
پشتیبانی از دستگاههای قدیمیتر
اگر بازی شما برای اجرا در طیف گستردهای از دستگاهها با سطوح مختلف قابلیتهای گرافیکی طراحی شده است، ممکن است لازم باشد از دستگاههای قدیمیتر از دستگاههای توصیهشده در انتخاب حداقل مشخصات دستگاه برای Vulkan پشتیبانی کنید. قبلاز ایجاد پشتیبانی برای دستگاههای قدیمیتر، ارزیابی کنید که آیا Vulkan مزایایی برای بازی شما ارائه میدهد یا نه. بازیهایی که فراخوانیهای ترسیم زیادی دارند و از OpenGL ES استفاده میکنند میتوانند بهدلیل هزینه بالای فراخوانیهای ترسیم در OpenGL ES، سربار درایور قابلتوجهی داشته باشند. این بازیها ممکن است بهدلیل صرف بخش زیادی از زمان پردازش فریم در درایور گرافیک، به CPU وابسته شوند. همچنین بازیها میتوانند با تغییر از OpenGL ES به Vulkan، کاهش قابلتوجهی در مصرف CPU و برق داشته باشند. این امر بهویژه زمانی کاربرد دارد که بازی شما صحنههای پیچیدهای داشته باشد که نتواند بهطور مؤثر از نمونهسازی برای کاهش فراخوانیهای ترسیم استفاده کند. هنگام هدفیابی دستگاههای قدیمیتر، پشتیبانی از پردازشی OpenGL ES را بهعنوان جایگزین اضافه کنید، زیرا برخیاز دستگاهها در فهرست دستگاههای هدف شما ممکن است پیادهسازیهای Vulkan داشته باشند که نمیتوانند بازی شما را بهطور قابلاعتماد اجرا کنند.
ممکن است نخواهید از دستگاههای قدیمیتر سازگار با Vulkan پشتیبانی کنید زیرا عملکرد و ویژگیهای لازم را ندارند یا مشکلات پایداری دارند.
عملکرد و ویژگیها
دستگاههای Android قدیمیتر با قابلیت Vulkan ممکن است عملکرد پردازشی یا پشتیبانی سختافزاری لازم برای ویژگیهای موردنیاز برای اجرای بازی شما را نداشته باشند. این امر بهویژه زمانی محتمل است که بازی شما گرافیک با کیفیت بالا داشته باشد و Vulkan تنها API باشد که در Android هدف قرار میدهید. بسیاری از دستگاههای قدیمیتر به نسخه ۱.۰.۳ از Vulkan API محدود هستند و اغلب فاقد افزونههای پرکاربرد Vulkan هستند که در سختافزارهای مدرنتر دردسترس است.
پایداری
دستگاههای Android قدیمیتر ممکن است از درایورهای 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 نسخه ۲۵ یا بالاتر استفاده کنید که شامل فایلهای سرایندهای است که از Vulkan نسخه ۱.۳ پشتیبانی میکنند. کیت توسعه نرمافزار Vulkan جدیدترین نسخه سرصفحهها را دارد.
ترجمه کردن کد سایهزن به SPIR-V
Vulkan API انتظار دارد برنامههای سایهزن در قالب واسطه دودویی SPIR-V ارائه شوند. این قرارداد با OpenGL ES متفاوت است، که در آن میتوانستید کد منبع نوشتهشده در OpenGL Shading Language (GLSL) را بهعنوان رشتههای نوشتاری ارسال کنید. از کامپایلر سایهزن برای گرفتن کد نوشتهشده در زبان سایهزن مانند GLSL یا High-level Shader Language (HLSL) و کامپایل کردن آن در ماژولهای SPIR-V برای استفاده با Vulkan استفاده کنید.
از کامپایلر shaderc میتوان برای کامپایل کردن برنامههای سایهزن نوشتهشده در GLSL به SPIR-V استفاده کرد. اگر بازی شما از HLSL استفاده میکند، DirectXShaderCompiler از خروجی SPIR-V پشتیبانی میکند. معمولاً، برنامههای سایهزن را بهصورت آفلاین بهعنوان بخشی از فرایند ساخت دارایی برای بازیتان کامپایل میکنید و واحدهای SPIR-V را بهعنوان بخشی از داراییهای زمان اجرای خود اضافه میکنید.
فراخوانی Vulkan API در زمان اجرا
برای فراخوانی Vulkan API، بازی شما باید اشارهگرهای تابع را برای فراخوانیهای Vulkan API دریافت کند. سادهترین راه برای انجام این کار، پیوند دادن به کتابخانه مشترک libvulkan.so است که در Android NDK گنجانده شده است. پیوند دادن به کتابخانه دو نقص دارد: سربار ارسال تابع اضافی و محدودیتهایی در اینکه کدام اشارهگرهای تابع Vulkan API بهطور خودکار حل میشوند.
وقتی تابع Vulkan API را فراخوانی میکنید، کنترل ازطریق جدول ارسال که توسط ساختاری بهنام بارکننده Vulkan مدیریت میشود، منتقل میشود. Android از پیادهسازی بارکننده Vulkan خودش استفاده میکند و نه از بارکننده LunarG. این سیستم بارکننده بخشی از معماری لایه Vulkan API است. پیوند دادن به کتابخانه سیستم در زمان ساخت منجر به سطح ارسال اضافی برای یک فراخوانی میانای برنامهسازی کاربردی معین میشود. اگرچه سربار کم است، اما میتواند برای بازیهایی که حجم بالایی از فراخوانیهای Vulkan را انجام میدهند، قابلتوجه باشد.
کتابخانه سیستم معمولاً فقط اشارهگرها را به توابع Vulkan که بخشی از میانای برنامهسازی کاربردی اصلی درنظر گرفته میشوند حل میکند. Vulkan تعداد زیادی افزونه دارد که توابع Vulkan اضافی را تعریف میکنند، بسیاری از آنها بهطور خودکار توسط کتابخانه سیستم حل نمیشوند. قبلاز استفاده از این توابع Vulkan، باید اشارهگرهای آنها را بهصورت دستی حل کنید.
برای کاهش این مشکلات، اشارهگرها را بهطور پویا به همه عملکردهای Vulkan که قصد دارید در زمان اجرا استفاده کنید، حل کنید. یک راه برای انجام این کار استفاده از
کتابخانه فرابارکننده متنباز مانند volk است. بازی نمونه
AGDKTunnel برای این منظور volk را ادغام میکند. اگر
از کتابخانه meta-loader استفاده میکنید، در اسکریپتهای ساخت خود به کتابخانه مشترک libvulkan.so
پیوند ندهید.
تعیین نسخه Vulkan API دردسترس
Android از نسخههای Vulkan API زیر پشتیبانی میکند:
- ۱.۰.۳
- ۱٫۱
- ۳-۱
بالاترین شماره نسخه Vulkan API موجود در دستگاهی خاص براساس نسخه Android و پشتیبانی درایور Vulkan تعیین میشود.
نسخه Android
پشتیبانی پلاتفرم از نسخه Vulkan API به حداقل نسخه Android (سطح API) بستگی دارد:
- ۱.۳ — Android 13.0 (سطح میانای برنامهسازی کاربردی ۳۳) و بالاتر
- ۱.۱ — Android نسخه ۱۰.۰ (سطح میانای برنامهسازی کاربردی ۲۹) و بالاتر
- 1.0.3 — Android 7.0 (سطح API ۲۴) و بالاتر
پشتیبانی درایور Vulkan
پشتیبانی پلاتفرم Android از نسخه Vulkan API تضمین نمیکند که نسخه API توسط درایور Vulkan دستگاه پشتیبانی شود. دستگاهی که Android 13 را اجرا میکند ممکن است فقط از نسخه ۱.۱ Vulkan API پشتیبانی کند.
هنگام مقداردهی اولیه Vulkan، نسخه میانای برنامهسازی کاربردی بزرگتر از موارد زیر را درخواست نکنید:
- حداکثر نسخه Vulkan API برای نسخه Android درحال اجرا در دستگاه
- نسخه 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 سال ۲۰۲۲، سازگار است یا نه، از کتابخانه میانای برنامهسازی کاربردی نمایههای Vulkan متنباز استفاده کنید. همچنین میتوانید فایل JSON نمایه را خودتان تجزیه کنید و بااستفاده از میاناهای برنامهسازی کاربردی Vulkan مربوطه، قابلیتهای دستگاه را پُرسمان کنید تا سازگاری نمایه را تعیین کنید.
نمایههای Vulkan
Android از نمایههای Vulkan استفاده میکند که مشخص میکند کدام ویژگیها و افزونهها برای هریک از دستگاههای دارای Android دردسترس است.
«نمایه مبنای Android» (ABP) اولین تلاش برای ساختن «نمایه Vulkan» است. ABP2021 و ABP2022 نمایههایی با نگاه به گذشته هستند که هدفشان پوشش دادن بیشاز ۸۵٪ دستگاههای فعال در آن زمان است. ازاینپس، «برنامه پاداشهای شریک» جدیدی وجود نخواهد داشت.
«نمایههای Vulkan برای Android» (VPA) نمایه آیندهنگر جدیدی است که هدف آن انعکاس نیازهای توسعهدهندگان نرمافزار و ارائه ویژگیهای سازگار بهمحض ارائه آنها توسط توسعهدهندگان سختافزار است. VPA15_minimums اولین نمایه برای Android 15 است و هر سال یک VPA جدید برای پوشش هر نسخه اصلی Android وجود خواهد داشت.
پیادهسازی گامبندی قاب
سرعت فریم مناسب بخش ضروری ارائه تجربه بازی با کیفیت بالا است. «کیت توسعه بازی Android» شامل کتابخانه سرعت فریم است تا به بازی شما کمک کند به سرعت فریم بهینه دست یابد. برای جزئیات بیشتر درباره پیادهسازی، ادغام کردن «آهنگ فریم Android» در پردازنده Vulkan را ببینید.
به همگامسازی ضمنی و سرعت قاب تکیه نکنید
vkAcquireNextImageKHR و vkQueuePresentKHR برای مدیریت swapchain استفاده میشوند. از تکیه بر رفتار مسدودسازی احتمالی آنها برای همگامسازی GPU یا برنامه عمومی اجتناب کنید.
رفتار دقیق مسدودسازی این توابع میتواند بهطور قابلتوجهی در موارد زیر متفاوت باشد:
- دستگاههای Android
- درایورهای GPU
- حالتهای موتور ارائه (VkPresentModeKHR)
تنها هدف vkAcquireNextImageKHR بهدست آوردن تصویر قابلارائه دردسترس است و ممکن است مسدود شود یا نشود. بهطور مشابه، vkQueuePresentKHR درخواستی را برای نمایش تصویر در صف قرار میدهد و ممکن است مسدود کند یا نکند.
هیچکدام از این توابع تضمین قابلاعتمادی برای همگامسازی کارهای CPU یا عملیات GPU غیرمرتبط ارائه نمیدهند.
برای همگامسازی قوی، همیشه از دستورات صریح Vulkan مانند پرچمها برای وابستگیهای GPU-GPU (مثلاً، رندر کردن برای ارائه)، حصارها برای همگامسازی GPU-CPU (مثلاً، دانستن زمان پایان رندر کردن در CPU)، و موانع خط لوله یا رویدادها برای اجرای دقیقتر GPU و وابستگیهای حافظه استفاده کنید. استفاده از همگامسازی صریح، رفتار قابلپیشبینی را تضمین میکند و از اشکالات جزئی ناشی از تغییرات زمانبندی خاص پیادهسازی که در بومسازگان سختافزاری متنوع Android وجود دارد جلوگیری میکند.
پیادهسازی پیشچرخش
دستگاههای Android میتوانند در جهتهای مختلفی نمایش داده شوند. جهت دستگاه میتواند با جهت سطح پردازش متفاوت باشد. برخلاف OpenGL ES در Android، Vulkan تفاوتهای بین این دو را مدیریت نمیکند. برای درک نحوه عملکرد فرایند جهتیابی و روش بهینه برای مدیریت تفاوتهای جهتیابی هنگام استفاده از Vulkan، به مدیریت چرخش دستگاه با پیشچرخش Vulkan مراجعه کنید.
عیبیابی و نمایهسازی پرداز Vulkan
ابزارهای متعددی برای کمک به شما در تشخیص مشکلات پردازشی و مشکلات عملکردی با کد پردازشی Vulkan دردسترس است.
برای اطلاعات بیشتر درباره ابزارهای نمایهسازی و اشکالزدایی Vulkan، به بخش ابزارها و ویژگیهای پیشرفته مراجعه کنید.
لایههای اعتبارسنجی Vulkan
لایههای اعتبارسنجی Vulkan کتابخانههای زمان اجرا هستند که میتوانند برای بازرسی تماسهای شما با Vulkan API فعال شوند و درباره استفاده نادرست یا غیربهینه هشدار یا خطا ارائه دهند. این لایههای اعتبارسنجی بهطور پیشفرض فعال نیستند، زیرا فرایند اعتبارسنجی سربار زمان اجرا اضافه میکند و بر عملکرد بازی شما تأثیر میگذارد. برای کسب اطلاعات درباره نحوه استفاده از لایههای اعتبارسنجی در بازی، به اشکالزدایی با لایه اعتبارسنجی مراجعه کنید.
ابزارهای ضبط قاب
از ابزارهای ضبط قاب برای ضبط و بازپخش تماسهای Vulkan API که درطول قاب بازی برقرار شدهاند استفاده کنید. این ابزارها به شما امکان میدهند:
- مشاهده اطلاعات و تجسمهای منابع گرافیکی فعال
- مشاهده توالی فراخوانیهای میانای برنامهسازی کاربردی که توسط بازی شما انجام شده است و مشاهده پارامترهای میانای برنامهسازی کاربردی
- کاوش وضعیت خط لوله گرافیک در زمان فراخوانی ترسیم
- تجسم نتایج پردازش تا فراخوانی ترسیم خاص در قاب
از ابزار متنباز RenderDoc برای ضبط قابها از بازیهای درحال اجرا در Android استفاده کنید. RenderDoc از ضبط فریم Vulkan و OpenGL ES پشتیبانی میکند.
از Android GPU Inspector (AGI) نیز میتوان برای ضبط فریمهای Vulkan استفاده کرد.
ابزارهای تجزیهوتحلیل عملکرد
از ابزارهای تحلیل عملکرد برای بررسی مشکلات پردازش در بازیتان که باعث نرخ فریم غیربهینه میشود استفاده کنید. فروشندگان واحد پردازش گرافیکی (GPU) ابزارهایی را ارائه میدهند که برای نمایه کردن بازی شما و ارائه دادههای عملکردی خاص معماریهای GPU آنها طراحی شدهاند. ویژگیهای عملکرد و گلوگاههای بازی شما میتواند هنگام پردازش در GPUهای فروشندگان مختلف یا حتی در نسلهای مختلف GPU از یک فروشنده بهطور قابلتوجهی متفاوت باشد.
همچنین میتوانید از Android GPU Inspector برای جمعآوری و تجزیهوتحلیل دادههای عملکرد استفاده کنید. برخلاف ابزارهای فروشنده، Android GPU Inspector با چندین GPU از فروشندگان مختلف سازگار است. بااینحال، Android GPU Inspector از دستگاههای Android قدیمیتر پشتیبانی نمیکند و ممکن است با همه دستگاههای جدید سازگار نباشد.
بهبود آزمایش Vulkan با CTS-D
سازندگان دستگاههای مجهز به Android از «مجموعه آزمایش سازگاری» (CTS) استفاده میکنند تا از سازگار بودن دستگاههایشان مطمئن شوند. مجموعه آزمون سازگاری با پشتیبانی توسعهدهنده (CTS-D) آزمونهایی هستند که توسعهدهندگان برنامه Android ارسال میکنند تا مطمئن شوند دستگاههای Android آینده موارد استفاده آنها را برآورده میکنند و میتوانند برنامههایشان را بهطور روان و بدون اشکال اجرا کنند.
اگر موفق شدید با برنامه Vulkan خود اشکال جدیدی را فعال کنید که بر هر دستگاه خاصی که با Android کار میکند تأثیر میگذارد، میتوانید پیشنهاد آزمایش جدیدی ارسال کنید و مشکل خود و راههای بررسی آن را شرح دهید. این کار تضمین میکند که مشکل در بهروزرسانی آینده دستگاه برطرف شود و همچنین تضمین میکند که همین اشکال در دستگاههای دیگر اتفاق نیفتد.
برای دستورالعملهای گامبهگام درباره نحوه ارسال پیشنهاد آزمایشی، فرایند ارسال CTS را بررسی کنید.