شروع کار با ولکان در اندروید
ولکان (Vulkan) رابط برنامهنویسی کاربردی (API) گرافیکی سطح پایین اصلی در اندروید است. ولکان عملکرد بهینه را برای بازیهایی که موتور بازی و رندرکنندهی خود را پیادهسازی میکنند، فراهم میکند.
برای پیادهسازی موفقیتآمیز Vulkan در موتور بازی خود، باید:
- مشخص کنید که کدام دستگاههای اندروید را با Vulkan استفاده کنید
- معایب پشتیبانی از دستگاههای قدیمی اندروید را درک کنید
- Vulkan را به هدف ساخت اندروید خود اضافه کنید
- یک کامپایلر سایهزن برای ایجاد SPIR-V برای Vulkan انتخاب کنید
- نسخه API موجود Vulkan را در زمان اجرا تعیین کنید
- یاد بگیرید چگونه عملیات رندرینگ Vulkan خود را با پروفایلهای Vulkan، تنظیم سرعت فریم و پیشچرخش بهینه کنید.
- ابزارهای گرافیکی را برای اشکالزدایی و تحلیل عملکرد انتخاب کنید
- توجه: برای اطلاعات بیشتر در مورد استفاده از Vulkan در اندروید با موتورهای بازی Unity یا Unreal، به لینک زیر مراجعه کنید:
- ولکان در یونیتی
- ولکان روی آنریل
حداقل مشخصات دستگاه را برای Vulkan انتخاب کنید
ولکان (Vulkan) از اندروید ۷.۰ (سطح API 24) به بعد روی اندروید در دسترس است. همه دستگاههای اندرویدی که اندروید ۷.۰ یا بالاتر دارند از ولکان پشتیبانی نمیکنند. شما باید مشخص کنید که بازی شما از کدام دستگاههای اندرویدی سازگار با ولکان پشتیبانی میکند.
توصیهها
مشخصات زیر را به عنوان حداقل الزامات برای پشتیبانی از Vulkan در نظر بگیرید:
- دستگاه دارای اندروید ۱۰.۰ (سطح API ۲۹) یا بالاتر است
- دستگاه از رابط برنامهنویسی Vulkan نسخه ۱.۱ یا بالاتر پشتیبانی میکند
- دستگاه دارای قابلیتها و ویژگیهای سختافزاری سازگار با پروفایل پایه اندروید ۲۰۲۲ است
پشتیبانی از دستگاههای قدیمیتر
اگر بازی شما برای اجرا روی طیف وسیعی از دستگاهها با سطوح مختلف قابلیتهای گرافیکی طراحی شده است، ممکن است نیاز به پشتیبانی از دستگاههای قدیمیتر از دستگاههای توصیهشده در «انتخاب حداقل مشخصات دستگاه برای Vulkan» داشته باشید. قبل از ایجاد پشتیبانی برای دستگاههای قدیمیتر، ارزیابی کنید که آیا Vulkan مزایایی برای بازی شما دارد یا خیر. بازیهایی که تعداد زیادی فراخوانی ترسیم دارند و از OpenGL ES استفاده میکنند، به دلیل هزینه بالای فراخوانی ترسیم در OpenGL ES، میتوانند سربار درایور قابل توجهی را تجربه کنند. این بازیها میتوانند به دلیل صرف بخش زیادی از زمان فریم خود در درایور گرافیک، به CPU وابسته شوند. بازیها همچنین میتوانند با تغییر از OpenGL ES به Vulkan، کاهش قابل توجهی در استفاده از CPU و برق مشاهده کنند. این امر به ویژه در صورتی که بازی شما صحنههای پیچیدهای دارد که نمیتوانند به طور مؤثر از نمونهسازی برای کاهش فراخوانیهای ترسیم استفاده کنند، صادق است. هنگام هدف قرار دادن دستگاههای قدیمیتر، پشتیبانی از رندر OpenGL ES را به عنوان یک جایگزین در نظر بگیرید، زیرا برخی از دستگاههای موجود در لیست دستگاههای هدف شما ممکن است پیادهسازیهای Vulkan داشته باشند که نمیتوانند بازی شما را به طور قابل اعتمادی اجرا کنند.
ممکن است نخواهید از دستگاههای قدیمیترِ سازگار با ولکان پشتیبانی کنید، زیرا فاقد عملکرد و ویژگیها هستند یا مشکلات پایداری دارند.
عملکرد و ویژگیها
دستگاههای اندروید قدیمیتر که از Vulkan پشتیبانی میکنند، ممکن است عملکرد رندر یا پشتیبانی سختافزاری لازم برای ویژگیهای مورد نیاز برای اجرای بازی شما را نداشته باشند. این امر به ویژه در صورتی محتمل است که بازی شما گرافیک با کیفیتی داشته باشد و Vulkan تنها API مورد نظر شما در اندروید باشد. بسیاری از دستگاههای قدیمیتر به نسخه ۱.۰.۳ API Vulkan محدود شدهاند و اغلب افزونههای پرکاربرد Vulkan که در سختافزارهای مدرنتر موجود است را ندارند.
پایداری
دستگاههای اندروید قدیمیتر میتوانند از درایورهای قدیمی Vulkan استفاده کنند. این نسخههای درایور ممکن است شامل اشکالاتی باشند که میتوانند بر پایداری بازی شما تأثیر بگذارند. رفع اشکالات درایور میتواند زمان قابل توجهی را برای آزمایش و مهندسی صرف کند.
ولکان را به پروژه خود اضافه کنید
برای اضافه کردن Vulkan به پروژه خود، باید:
- هدرهای API Vulkan را وارد کنید
- کامپایل کد شیدر به SPIR-V
- فراخوانی API ولکان در زمان اجرا
هدرهای API Vulkan را وارد کنید
بازی شما برای کامپایل کدی که از Vulkan استفاده میکند، باید فایلهای هدر API مربوط به Vulkan را شامل شود. میتوانید یک کپی از هدرهای Vulkan را در Android NDK یا بستهبندی شده در نسخههای Vulkan SDK پیدا کنید. هر نسخه خاص NDK فقط شامل هدرهای Vulkan موجود در زمان انتشار NDK است. اگر از هدرهای Vulkan از NDK استفاده میکنید، از نسخه NDK 25 یا بالاتر استفاده کنید که شامل فایلهای هدری است که از نسخه 1.3 Vulkan پشتیبانی میکنند. Vulkan SDK جدیدترین نسخه هدرها را دارد.
کامپایل کد شیدر به SPIR-V
رابط برنامهنویسی کاربردی Vulkan انتظار دارد که برنامههای سایهزن در قالب میانی دودویی SPIR-V ارائه شوند. این قرارداد با OpenGL ES متفاوت است، که در آن میتوانستید کد منبع نوشته شده با زبان سایهزن OpenGL (GLSL) را به عنوان رشتههای متنی ارسال کنید. از یک کامپایلر سایهزن برای دریافت کد نوشته شده با یک زبان سایهزن مانند GLSL یا زبان سایهزن سطح بالا (HLSL) استفاده کنید و آن را در ماژولهای SPIR-V برای استفاده با Vulkan کامپایل کنید.
کامپایلر shaderc میتواند برای کامپایل برنامههای shader نوشته شده در GLSL به SPIR-V استفاده شود. اگر بازی شما از HLSL استفاده میکند، DirectXShaderCompiler از خروجی SPIR-V پشتیبانی میکند. معمولاً، شما برنامههای shader را به صورت آفلاین به عنوان بخشی از فرآیند ساخت asset برای بازی خود کامپایل میکنید و ماژولهای SPIR-V را به عنوان بخشی از assets زمان اجرا خود لحاظ میکنید.
فراخوانی API ولکان در زمان اجرا
برای فراخوانی API ولکان، بازی شما باید اشارهگرهای تابع را به فراخوانیهای API ولکان دریافت کند. سادهترین راه برای انجام این کار، پیوند دادن به کتابخانه مشترک libvulkan.so است که در Android NDK گنجانده شده است. پیوند دادن به کتابخانه دو نقص دارد: سربار اضافی ارسال تابع و محدودیتهایی که اشارهگرهای تابع API ولکان به طور خودکار بر اساس آنها حل میشوند.
وقتی یک تابع API مربوط به Vulkan را فراخوانی میکنید، کنترل از طریق یک جدول ارسال که توسط ساختاری به نام Vulkan loader مدیریت میشود، عبور میکند. اندروید از پیادهسازی Vulkan loader مخصوص به خود استفاده میکند و نه LunarG loader. این سیستم بارگذاری بخشی از معماری لایهای Vulkan API است. اتصال به کتابخانه سیستم در زمان ساخت، منجر به یک سطح ارسال اضافی برای یک فراخوانی API مشخص میشود. اگرچه سربار کوچک است، اما میتواند برای بازیهایی که حجم بالایی از فراخوانیهای Vulkan را انجام میدهند، قابل توجه باشد.
کتابخانه سیستم معمولاً فقط اشارهگرهایی به توابع Vulkan را که بخشی از API اصلی در نظر گرفته میشوند، حل میکند. Vulkan تعداد زیادی افزونه دارد که توابع Vulkan اضافی را تعریف میکنند، که بسیاری از آنها به طور خودکار توسط کتابخانه سیستم حل نمیشوند. شما باید قبل از استفاده از آنها، اشارهگرها را به صورت دستی به این توابع Vulkan حل کنید.
برای کاهش این مشکلات، به صورت پویا اشارهگرها را به تمام توابع Vulkan که قصد استفاده از آنها را در زمان اجرا دارید، حل کنید. یکی از راههای دستیابی به این هدف، استفاده از یک کتابخانهی متنباز meta-loader مانند volk است. بازی نمونهی AGDKTunnel ، volk را برای این منظور ادغام میکند. اگر از یک کتابخانهی meta-loader استفاده میکنید، در اسکریپتهای ساخت خود، کتابخانهی مشترک libvulkan.so را به آن لینک نکنید.
نسخه API موجود Vulkan را تعیین کنید
اندروید از نسخههای API ولکان زیر پشتیبانی میکند:
- ۱.۰.۳
- ۱.۱
- ۱.۳
بالاترین شماره نسخه API ولکان موجود در یک دستگاه مشخص، توسط نسخه اندروید و پشتیبانی از درایور ولکان تعیین میشود.
نسخه اندروید
پشتیبانی پلتفرم برای نسخه API ولکان به حداقل نسخه اندروید (سطح API) بستگی دارد:
- ۱.۳ - اندروید ۱۳.۰ (سطح API ۳۳) و بالاتر
- ۱.۱ - اندروید ۱۰.۰ (سطح API ۲۹) و بالاتر
- ۱.۰.۳ - اندروید ۷.۰ (سطح API ۲۴) و بالاتر
پشتیبانی از درایور ولکان
پشتیبانی پلتفرم اندروید از نسخهای از رابط برنامهنویسی Vulkan تضمین نمیکند که آن نسخه از رابط برنامهنویسی توسط درایور Vulkan دستگاه پشتیبانی شود. دستگاهی که اندروید ۱۳ را اجرا میکند، ممکن است فقط از نسخه ۱.۱ رابط برنامهنویسی Vulkan پشتیبانی کند.
هنگام راهاندازی اولیه Vulkan، نسخه API بزرگتر از موارد زیر را درخواست نکنید:
- حداکثر نسخه API ولکان برای نسخه اندروید در حال اجرا روی دستگاه
- نسخه API ولکان که توسط vkEnumerateInstanceVersion گزارش شده است
- نسخه API ولکان که توسط ویژگی
apiVersionاز ساختار VkPhysicalDeviceProperties گزارش شده است
مثالی از تعیین بالاترین نسخه پشتیبانیشدهی رابط برنامهنویسی Vulkan در ادامه آمده است:
// 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 را تعیین کنید
پروفایلهای ولکان فایلهای JSON هستند که مجموعهای از ویژگیها، افزونهها، قابلیتها و حداقل محدودیتهای پارامتر مورد نیاز را که یک دستگاه ولکان باید برای سازگاری با پروفایل پشتیبانی کند، تعریف میکنند. برای تعیین اینکه آیا یک دستگاه با یک پروفایل خاص ولکان، مانند پروفایل پایه اندروید 2022، سازگار است یا خیر، از کتابخانه API پروفایلهای ولکان متنباز استفاده کنید. همچنین میتوانید فایل JSON پروفایل را خودتان تجزیه کنید و با استفاده از APIهای مربوط به ولکان، قابلیتهای دستگاه را برای تعیین سازگاری پروفایل جستجو کنید.
پروفیلهای ولکان
اندروید از پروفایلهای Vulkan استفاده میکند که مشخص میکند کدام ویژگیها و افزونهها برای هر یک از دستگاههای دارای اندروید در دسترس هستند.
پروفایل پایه اندروید (ABP) اولین تلاش برای ساخت پروفایل Vulkan است. ABP2021 و ABP2022 پروفایلهای عقبنگر هستند که هدفشان پوشش بیش از ۸۵٪ از دستگاههای فعال در آن زمان است. از این به بعد هیچ ABP جدیدی وجود نخواهد داشت.
پروفایلهای Vulkan برای اندروید (VPA) یک پروفایل جدید و آیندهنگر است که با هدف انعکاس نیازهای توسعهدهندگان نرمافزار و ارائه ویژگیهای سازگار، به محض اینکه توسعهدهندگان سختافزار بتوانند آنها را ارائه دهند، ایجاد شده است. VPA15_minimums اولین پروفایل برای اندروید ۱۵ است و هر ساله یک VPA جدید برای پوشش هر نسخه اصلی اندروید ارائه خواهد شد.
پیادهسازی سرعت فریم
تنظیم سرعت فریم مناسب بخش مهمی از ارائه یک تجربه گیمپلی با کیفیت بالا است. کیت توسعه بازی اندروید شامل کتابخانه تنظیم سرعت فریم است تا به بازی شما در دستیابی به تنظیم سرعت فریم بهینه کمک کند. برای جزئیات بیشتر در مورد پیادهسازی، به بخش «ادغام تنظیم سرعت فریم اندروید در رندر Vulkan» مراجعه کنید.
به همگامسازی ضمنی و تنظیم فریمها تکیه نکنید
vkAcquireNextImageKHR و vkQueuePresentKHR برای مدیریت swapchain استفاده میشوند. از تکیه بر رفتار مسدودکننده بالقوه آنها برای هماهنگسازی برنامههای عمومی یا GPU خودداری کنید.
رفتار دقیق مسدود کردن این توابع میتواند به طور قابل توجهی در موارد زیر متفاوت باشد:
- دستگاههای اندروید
- درایورهای پردازنده گرافیکی
- حالتهای موتور ارائه ( VkPresentModeKHR )
تنها هدف vkAcquireNextImageKHR دریافت یک تصویر قابل ارائه موجود است و ممکن است مسدود شود یا نشود. به طور مشابه، vkQueuePresentKHR درخواستی را برای نمایش یک تصویر در صف قرار میدهد و همچنین ممکن است مسدود شود یا نشود.
هیچکدام از این دو تابع، تضمین قابل اعتمادی برای همگامسازی وظایف نامرتبط CPU یا عملیات GPU ارائه نمیدهند.
برای همگامسازی قوی، همیشه از عناصر اولیه صریح Vulkan مانند سمافورها برای وابستگیهای GPU-GPU (مثلاً رندر تا ارائه)، حصارها برای همگامسازی GPU-CPU (مثلاً دانستن زمان پایان رندر در CPU) و موانع یا رویدادهای خط لوله برای وابستگیهای دقیقتر اجرا و حافظه GPU استفاده کنید. استفاده از همگامسازی صریح، رفتار قابل پیشبینی را تضمین میکند و از اشکالات ظریف ناشی از تغییرات زمانبندی خاص پیادهسازی که ذاتی در اکوسیستم سختافزاری متنوع اندروید است، جلوگیری میکند.
پیادهسازی پیشچرخش
دستگاههای اندروید میتوانند در چندین جهت نمایش داده شوند. جهت دستگاه میتواند با جهت سطح رندر متفاوت باشد. برخلاف OpenGL ES در اندروید، Vulkan اختلافات بین این دو را مدیریت نمیکند. برای درک نحوه عملکرد فرآیند جهتگیری و روش بهینه مدیریت تفاوتهای جهتگیری هنگام استفاده از Vulkan، به بخش «مدیریت چرخش دستگاه با پیشچرخش Vulkan» مراجعه کنید.
عیبیابی و نمایش رندر Vulkan
ابزارهای متعددی برای کمک به شما در تشخیص مشکلات رندرینگ و مشکلات عملکردی با کد رندرینگ Vulkan در دسترس هستند.
برای اطلاعات بیشتر در مورد ابزارهای اشکالزدایی و پروفایلینگ Vulkan، بخش ابزارها و ویژگیهای پیشرفته را بررسی کنید.
لایههای اعتبارسنجی ولکان
لایههای اعتبارسنجی Vulkan، کتابخانههای زمان اجرا هستند که میتوانند برای بررسی فراخوانیهای شما به API Vulkan و ارائه هشدارها یا خطاهایی در مورد استفاده نادرست یا غیربهینه فعال شوند. این لایههای اعتبارسنجی به طور پیشفرض فعال نیستند، زیرا فرآیند اعتبارسنجی سربار زمان اجرا را اضافه میکند و بر عملکرد بازی شما تأثیر میگذارد. برای اطلاعات بیشتر در مورد نحوه استفاده از لایههای اعتبارسنجی با بازی خود، به بخش اشکالزدایی با لایه اعتبارسنجی مراجعه کنید.
ابزارهای ضبط فریم
از ابزارهای ضبط فریم برای ضبط و پخش مجدد فراخوانیهای Vulkan API که در طول یک فریم بازی انجام میشود، استفاده کنید. این ابزارها به شما امکان میدهند:
- مشاهده اطلاعات و تجسم منابع گرافیکی فعال
- ترتیب فراخوانیهای API انجام شده توسط بازی خود و پارامترهای API را مشاهده کنید
- بررسی وضعیت خط لوله گرافیکی در زمان فراخوانی قرعهکشی
- نتایج رندر را تا یک فراخوان ترسیم خاص در فریم، تجسم کنید.
از ابزار متنباز RenderDoc برای ضبط فریم از بازیهای در حال اجرا در اندروید استفاده کنید. RenderDoc از ضبط فریم هم در Vulkan و هم در OpenGL ES پشتیبانی میکند.
همچنین میتوان از Android GPU Inspector (AGI) برای ضبط فریمهای Vulkan استفاده کرد.
ابزارهای تحلیل عملکرد
از ابزارهای تحلیل عملکرد برای بررسی مشکلات رندرینگ در بازی خود که باعث نرخ فریم کمتر از حد مطلوب میشوند، استفاده کنید. فروشندگان پردازندههای گرافیکی ابزارهایی را ارائه میدهند که برای پروفایل کردن بازی شما طراحی شدهاند و دادههای عملکردی مختص معماری پردازندههای گرافیکی خود را ارائه میدهند. ویژگیهای عملکرد و گلوگاههای بازی شما میتواند هنگام رندرینگ روی پردازندههای گرافیکی از فروشندگان مختلف یا حتی روی نسلهای مختلف پردازندههای گرافیکی از یک فروشنده، به طور قابل توجهی متفاوت باشد.
همچنین میتوانید از Android GPU Inspector برای جمعآوری و تحلیل دادههای عملکرد استفاده کنید. برخلاف ابزارهای فروشندگان، Android GPU Inspector با چندین پردازنده گرافیکی از فروشندگان مختلف سازگار است. با این حال، Android GPU Inspector از دستگاههای قدیمیتر اندروید پشتیبانی نمیکند و ممکن است با همه دستگاههای جدید سازگار نباشد.
بهبود تست ولکان با CTS-D
تولیدکنندگان دستگاههای مبتنی بر اندروید از مجموعه تست سازگاری (CTS) برای اطمینان از سازگاری دستگاههای خود استفاده میکنند. CTS مبتنی بر توسعهدهندگان (CTS-D) آزمایشهایی هستند که توسط توسعهدهندگان برنامههای اندروید ارائه میشوند تا اطمینان حاصل شود که دستگاههای اندروید آینده موارد استفاده آنها را برآورده میکنند و قادر به اجرای روان و بدون اشکال برنامههای آنها هستند.
اگر موفق شدید با برنامه Vulkan خود یک اشکال جدید ایجاد کنید که بر روی هر دستگاه خاص مبتنی بر اندروید تأثیر میگذارد، میتوانید یک پیشنهاد آزمایش جدید ارسال کنید، مشکل خود و روشهای بررسی آن را شرح دهید. این کار تضمین میکند که مشکل در بهروزرسانیهای بعدی دستگاه برطرف میشود و همچنین تضمین میکند که همین اشکال برای هیچ دستگاه دیگری اتفاق نخواهد افتاد.
برای دستورالعملهای گام به گام در مورد نحوه ارسال پیشنهاد آزمون، فرآیند ارسال CTS را بررسی کنید.