بدء استخدام 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 (المستوى 24 من واجهة برمجة التطبيقات). لا تدعم جميع أجهزة Android التي تعمل بالإصدار 7.0 من نظام التشغيل Android أو الإصدارات الأحدث واجهة Vulkan. عليك تحديد أجهزة Android المتوافقة مع Vulkan والتي يمكن تشغيل لعبتك عليها.
الاقتراحات
استخدِم المواصفات التالية كحدّ أدنى لمتطلبات دعم Vulkan:
- يعمل الجهاز بالإصدار 10.0 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) أو إصدار أحدث
- يدعم الجهاز الإصدار 1.1 أو إصدار أحدث من واجهة برمجة التطبيقات Vulkan
- يحتوي الجهاز على إمكانات وميزات متوافقة مع الملف الشخصي الأساسي لنظام Android لعام 2022
التوافق مع الأجهزة القديمة
إذا كانت لعبتك مصمَّمة للتشغيل على مجموعة كبيرة من الأجهزة ذات المستويات المتفاوتة من إمكانات الرسومات، قد تحتاج إلى توفير الدعم للأجهزة الأقدم من تلك المقترَحة في اختيار الحد الأدنى لمواصفات الأجهزة التي تدعم Vulkan. قبل إنشاء دعم للأجهزة القديمة، عليك تقييم ما إذا كان Vulkan يوفّر مزايا للعبتك. الألعاب التي تتضمّن الكثير من طلبات الرسم وتستخدم OpenGL ES قد تواجه عبئًا كبيرًا على برنامج التشغيل بسبب التكلفة العالية لإجراء طلبات الرسم ضمن OpenGL ES. قد تصبح هذه الألعاب مرتبطة بوحدة المعالجة المركزية (CPU) بسبب قضاء أجزاء كبيرة من وقت عرض اللقطة في برنامج تشغيل الرسومات. يمكن أن تشهد الألعاب أيضًا انخفاضًا كبيرًا في استخدام وحدة المعالجة المركزية (CPU) والطاقة من خلال التبديل من OpenGL ES إلى Vulkan. وينطبق ذلك بشكل خاص إذا كانت لعبتك تحتوي على مشاهد معقّدة لا يمكنها استخدام ميزة "إنشاء النُسخ" بشكل فعّال لتقليل طلبات الرسم. عند استهداف الأجهزة القديمة، يجب تضمين دعم عرض OpenGL ES كخيار احتياطي، لأنّ بعض الأجهزة في قائمة الأجهزة المستهدَفة قد تحتوي على عمليات تنفيذ Vulkan التي لا يمكنها تشغيل لعبتك بشكل موثوق.
قد لا ترغب في إتاحة الأجهزة القديمة المتوافقة مع Vulkan لأنّها تفتقر إلى الأداء والميزات أو تواجه مشاكل في الثبات.
الأداء والميزات
قد لا تتوفّر في أجهزة Android القديمة المتوافقة مع Vulkan إمكانات عرض الرسومات أو دعم الأجهزة للميزات اللازمة لتشغيل لعبتك. ويُرجَّح حدوث ذلك إذا كانت لعبتك تتضمّن رسومات عالية الدقة وكانت Vulkan هي واجهة برمجة التطبيقات الوحيدة التي تستهدفها على Android. تقتصر العديد من الأجهزة القديمة على الإصدار 1.0.3 من واجهة برمجة التطبيقات Vulkan، وغالبًا ما تفتقر إلى إضافات Vulkan المستخدَمة على نطاق واسع والمتوفّرة على الأجهزة الأكثر حداثة.
الثبات
قد تستخدم أجهزة Android القديمة برامج تشغيل Vulkan قديمة. قد تتضمّن إصدارات برامج التشغيل هذه أخطاءً يمكن أن تؤثر في ثبات لعبتك. قد يتطلّب حلّ الأخطاء في برامج التشغيل وقتًا طويلاً لإجراء الاختبارات والمهام الهندسية.
إضافة Vulkan إلى مشروعك
لإضافة Vulkan إلى مشروعك، عليك اتّباع الخطوات التالية:
- تضمين عناوين Vulkan API
- تجميع رمز التظليل إلى SPIR-V
- استدعاء واجهة برمجة التطبيقات Vulkan API في وقت التشغيل
تضمين عناوين Vulkan API
يجب أن تتضمّن لعبتك ملفات عناوين Vulkan API لتجميع الرموز البرمجية التي تستخدم Vulkan. يمكنك العثور على نسخة من عناوين Vulkan في Android NDK أو مجمّعة في إصدارات حزمة تطوير البرامج (SDK) لـ Vulkan. يتضمّن أي إصدار معيّن من NDK رؤوس Vulkan المتاحة فقط في وقت إصدار NDK. إذا كنت تستخدم ملفات عناوين Vulkan من NDK، استخدِم الإصدار 25 من NDK أو إصدارًا أحدث، والذي يتضمّن ملفات عناوين متوافقة مع الإصدار 1.3 من Vulkan. تحتوي حزمة تطوير البرامج (SDK) لـ Vulkan على أحدث إصدار من العناوين.
تجميع رمز التظليل إلى SPIR-V
تتوقّع واجهة برمجة التطبيقات Vulkan أن يتم توفير برامج التظليل بتنسيق SPIR-V الثنائي الوسيط. تختلف هذه الطريقة عن OpenGL ES، حيث يمكنك إرسال الرمز المصدر المكتوب بلغة OpenGL Shading Language (GLSL) كسلاسل نصية. استخدِم برنامج تجميع تظليل لأخذ الرمز المكتوب بلغة تظليل، مثل GLSL أو لغة التظليل العالية المستوى (HLSL)، وتجميعه في وحدات SPIR-V لاستخدامها مع Vulkan.
يمكن استخدام برنامج التجميع shaderc لتجميع برامج التظليل المكتوبة بلغة GLSL في SPIR-V. إذا كانت لعبتك تستخدم HLSL، يتيح DirectXShaderCompiler إخراج SPIR-V. عادةً ما يتم تجميع برامج التظليل بلا إنترنت كجزء من عملية إنشاء مواد العرض للعبة وتضمين وحدات SPIR-V كجزء من مواد العرض في وقت التشغيل.
استدعاء واجهة برمجة التطبيقات Vulkan API في وقت التشغيل
لاستدعاء واجهة برمجة التطبيقات Vulkan، يجب أن تحصل لعبتك على مؤشرات الدوال لطلبات بيانات من واجهة برمجة التطبيقات Vulkan. أسهل طريقة لإجراء ذلك هي الربط بمكتبة libvulkan.so المشتركة المضمّنة في Android NDK. هناك عيبان في الربط بالمكتبة: عبء إضافي في إرسال الدوال وقيود على مؤشرات دوال Vulkan API التي يتم حلّها تلقائيًا.
عند استدعاء دالة في واجهة برمجة تطبيقات Vulkan، يتم تمرير عنصر التحكّم من خلال جدول إرسال تتم إدارته من خلال بنية تُسمى "أداة تحميل Vulkan". يستخدم Android عملية تنفيذ أداة تحميل Vulkan الخاصة به وليس أداة تحميل LunarG. يُعدّ نظام التحميل هذا جزءًا من بنية الطبقات في Vulkan API. يؤدي الربط بمكتبة النظام في وقت الإنشاء إلى مستوى إرسال إضافي لطلب بيانات من واجهة برمجة التطبيقات. على الرغم من أنّ النفقات العامة صغيرة، إلا أنّها قد تكون ملحوظة للألعاب التي تُجري أعدادًا كبيرة من طلبات Vulkan.
بشكل عام، لا تحلّ مكتبة النظام سوى المؤشرات إلى دوال Vulkan التي تُعدّ جزءًا من واجهة برمجة التطبيقات الأساسية. يحتوي Vulkan على عدد كبير من الإضافات التي تحدّد وظائف Vulkan الإضافية، ولا يتم حلّ العديد منها تلقائيًا من خلال مكتبة النظام. عليك حلّ المؤشرات يدويًا لهذه الدوال في Vulkan قبل استخدامها.
للحدّ من هذه المشاكل، يمكنك حلّ المؤشرات ديناميكيًا لجميع دوال Vulkan
التي تنوي استخدامها في وقت التشغيل. ويمكنك تحقيق ذلك من خلال استخدام مكتبة برامج تحميل بيانات وصفية مفتوحة المصدر، مثل volk. تدمج نموذج اللعبة AGDKTunnel مكتبة volk لهذا الغرض. إذا كنت تستخدم مكتبة meta-loader، لا تربطها بمكتبة libvulkan.so المشتركة في نصوص الإنشاء البرمجية.
تحديد إصدار Vulkan API المتاح
يتوافق Android مع إصدارات واجهة برمجة التطبيقات Vulkan التالية:
- 1.0.3
- 1.1
- 1.3
يتم تحديد أعلى رقم لإصدار واجهة برمجة التطبيقات Vulkan API المتاح على جهاز معيّن حسب إصدار Android ومدى توافق برنامج تشغيل Vulkan.
إصدار Android
يعتمد توافق النظام الأساسي مع إصدار واجهة برمجة تطبيقات Vulkan على الحد الأدنى لإصدار Android (مستوى واجهة برمجة التطبيقات):
- 1.3 — الإصدار 13.0 من نظام التشغيل Android (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث
- 1.1 — الإصدار 10.0 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث
- الإصدار 1.0.3: Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث
دعم برامج تشغيل Vulkan
إنّ توافق نظام Android الأساسي مع إصدار واجهة برمجة تطبيقات Vulkan لا يضمن توافق إصدار واجهة برمجة التطبيقات مع برنامج تشغيل Vulkan على الجهاز. قد يكون الجهاز الذي يعمل بنظام التشغيل Android 13 متوافقًا مع الإصدار 1.1 فقط من واجهة برمجة التطبيقات Vulkan.
عند إعداد Vulkan، لا تطلب إصدار واجهة برمجة تطبيقات أكبر من:
- الحد الأقصى لإصدار واجهة برمجة التطبيقات Vulkan لإصدار Android الذي يعمل على الجهاز
- إصدار Vulkan API الذي تم الإبلاغ عنه من خلال vkEnumerateInstanceVersion
- إصدار Vulkan 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 الشخصي
ملفات Vulkan الشخصية هي ملفات JSON تحدّد مجموعة من الميزات والإضافات والإمكانات والحدود الدنيا للمَعلمات المطلوبة التي يجب أن يوفّرها جهاز Vulkan ليكون متوافقًا مع الملف الشخصي. لتحديد ما إذا كان الجهاز متوافقًا مع ملف شخصي معيّن في Vulkan، مثل ملف Android Baseline الشخصي لعام 2022، استخدِم مكتبة Vulkan Profiles API المفتوحة المصدر. يمكنك أيضًا تحليل ملف JSON الخاص بالملف الشخصي بنفسك والاستعلام عن إمكانات الجهاز باستخدام واجهات برمجة تطبيقات Vulkan ذات الصلة لتحديد مدى توافق الملف الشخصي.
ملفات Vulkan الشخصية
يستخدم Android ملفات Vulkan الشخصية التي تحدّد الميزات والإضافات المتاحة لكل جهاز يعمل بنظام التشغيل Android.
ملف Android Baseline Profile (ABP) هو المحاولة الأولى لإنشاء ملف Vulkan Profile. ABP2021 وABP2022 هما ملفّا تعريف يهدفان إلى تغطية أكثر من% 85 من الأجهزة النشطة في ذلك الوقت. لن يتم إصدار أي حزمة ABP جديدة من الآن فصاعدًا.
"ملفات Vulkan الشخصية لنظام التشغيل Android" (VPA) هي الملف الشخصي الجديد الذي يتطلّع إلى المستقبل ويهدف إلى تلبية احتياجات مطوّري البرامج وتقديم ميزات متّسقة في أقرب وقت ممكن، وذلك عندما يتمكّن مطوّرو الأجهزة من تقديمها. VPA15_minimums هو الملف الشخصي الأول لنظام التشغيل Android 15، وسيكون هناك ملف VPA جديد كل عام لتغطية كل إصدار رئيسي من Android.
تنفيذ ميزة "مزامنة عرض اللقطات"
يُعدّ ضبط معدّل عرض اللقطات جزءًا أساسيًا من تقديم تجربة لعب عالية الجودة. تتضمّن حزمة تطوير الألعاب على Android مكتبة Frame Pacing لمساعدة لعبتك في تحقيق معدّل عرض إطارات مثالي. لمزيد من التفاصيل حول التنفيذ، يُرجى الاطّلاع على دمج Android Frame Pacing في أداة عرض Vulkan.
تجنُّب الاعتماد على المزامنة الضمنية ومعدّل عرض الإطارات
يتم استخدام vkAcquireNextImageKHR وvkQueuePresentKHR لإدارة سلسلة التبديل. تجنَّب الاعتماد على سلوك الحظر المحتمل للتطبيق العام أو مزامنة وحدة معالجة الرسومات.
يمكن أن يختلف سلوك الحظر الدقيق لهذه الدوال بشكل كبير عبر:
- أجهزة Android
- برامج تشغيل وحدات معالجة الرسومات
- حالات محرّك العرض التقديمي (VkPresentModeKHR)
الغرض الوحيد من vkAcquireNextImageKHR هو الحصول على صورة متاحة قابلة للعرض، وقد يتم حظرها أو لا. وبالمثل، يضع vkQueuePresentKHR طلبًا في قائمة الانتظار لعرض صورة، وقد يحظر أو لا يحظر.
ولا توفّر أي من الدالتين ضمانات موثوقة لمزامنة مهام وحدة المعالجة المركزية (CPU) أو عمليات وحدة معالجة الرسومات (GPU) غير المرتبطة ببعضها.
لضمان مزامنة قوية، استخدِم دائمًا عناصر Vulkan الأساسية الصريحة، مثل إشارات المرور لتبعيات وحدة معالجة الرسومات (مثل العرض إلى العرض)، والحواجز لمزامنة وحدة معالجة الرسومات مع وحدة المعالجة المركزية (مثل معرفة وقت انتهاء العرض على وحدة المعالجة المركزية)، وحواجز المسار أو الأحداث لتنفيذ وحدة معالجة الرسومات بشكل أكثر دقة وتبعيات الذاكرة. يضمن استخدام المزامنة الصريحة سلوكًا يمكن توقّعه ويتجنّب الأخطاء الدقيقة الناتجة عن الاختلافات في التوقيت الخاص بالتنفيذ المتأصلة في منظومة الأجهزة المتنوعة في Android.
تنفيذ عملية التدوير المُسبَق
يمكن عرض أجهزة Android في اتجاهات متعددة. يمكن أن يختلف اتجاه الجهاز عن اتجاه سطح العرض. على عكس OpenGL ES على Android، لا يتعامل Vulkan مع الاختلافات بين الاثنين. لفهم آلية عمل عملية الاتجاه والطريقة المثلى للتعامل مع اختلافات الاتجاه عند استخدام Vulkan، يُرجى الاطّلاع على التعامل مع تدوير الجهاز باستخدام ميزة التدوير المُسبَق في Vulkan.
تحديد المشاكل وحلّها وإنشاء ملف شخصي لعرض Vulkan
تتوفّر أدوات متعددة لمساعدتك في تشخيص مشاكل العرض ومشاكل الأداء في رمز عرض Vulkan.
لمزيد من المعلومات حول أدوات تصحيح الأخطاء وتحليل الأداء في Vulkan، يُرجى الاطّلاع على قسم الأدوات والميزات المتقدّمة.
مراحل التحقّق من Vulkan
مراحل التحقّق من Vulkan هي مكتبات وقت التشغيل التي يمكن تفعيلها لفحص طلباتك إلى Vulkan API وتقديم تحذيرات أو أخطاء بشأن الاستخدام غير الصحيح أو غير الأمثل. لا تكون مراحل التحقّق هذه نشطة تلقائيًا، لأنّ عملية التحقّق تضيف وقت تشغيل إضافيًا وتؤثر في أداء لعبتك. للحصول على معلومات حول كيفية استخدام مراحل التحقّق في لعبتك، يُرجى الاطّلاع على مقالة تصحيح الأخطاء باستخدام مرحلة التحقّق.
أدوات التقاط لقطات الشاشة
استخدِم أدوات التقاط إطارات لتسجيل طلبات بيانات من واجهة برمجة التطبيقات Vulkan التي تم إجراؤها أثناء إطار اللعبة وإعادة تشغيلها. تتيح لك هذه الأدوات ما يلي:
- عرض معلومات عن موارد الرسومات النشطة وعرضها
- الاطّلاع على تسلسل طلبات البيانات من واجهة برمجة التطبيقات التي تُجريها لعبتك ومعلَمات واجهة برمجة التطبيقات
- استكشاف حالة مسار الرسومات في وقت طلب الرسم
- عرض نتائج العرض حتى طلب رسم معيّن في الإطار
استخدِم أداة RenderDoc المفتوحة المصدر لتسجيل اللقطات من الألعاب التي تعمل على Android. يتيح RenderDoc التقاط اللقطات لكل من Vulkan وOpenGL ES.
يمكن أيضًا استخدام Android GPU Inspector (AGI) لتسجيل لقطات Vulkan.
أدوات تحليل الأداء
استخدِم أدوات تحليل الأداء للتحقيق في مشاكل العرض في لعبتك التي تؤدي إلى انخفاض عدد اللقطات في الثانية. يوفّر مورّدو وحدات معالجة الرسومات الفردية أدوات مصمّمة لإنشاء ملفات تعريفية للعبتك وتقديم بيانات الأداء الخاصة ببُنى وحدات معالجة الرسومات لديهم. يمكن أن تختلف خصائص الأداء ومشاكل الأداء في لعبتك بشكل كبير عند عرضها على وحدات معالجة الرسومات من مورّدين مختلفين أو حتى على أجيال مختلفة من وحدات معالجة الرسومات من المورّد نفسه.
يمكنك أيضًا استخدام Android GPU Inspector لجمع بيانات الأداء وتحليلها. على عكس أدوات المورّدين، يتوافق Android GPU Inspector مع وحدات معالجة رسومات متعددة من مورّدين مختلفين. ومع ذلك، لا تتوافق أداة Android GPU Inspector مع أجهزة Android القديمة وقد لا تتوافق مع بعض الأجهزة الجديدة.
تحسين اختبار Vulkan باستخدام CTS-D
تستخدم الشركات المصنّعة للأجهزة التي تعمل بنظام التشغيل Android "مجموعة أدوات اختبار التوافق" (CTS) للمساعدة في التأكّد من توافق أجهزتها. مجموعة أدوات اختبار التوافق (CTS) التي يوفّرها المطوّرون (CTS-D) هي اختبارات يرسلها مطوّرو تطبيقات Android للتأكّد من أنّ أجهزة Android المستقبلية تلبّي حالات الاستخدام الخاصة بهم ويمكنها تشغيل تطبيقاتهم بسلاسة وبدون أخطاء.
إذا تمكّنت من رصد خطأ جديد في تطبيق Vulkan يؤثر في أي جهاز معيّن يعمل بنظام التشغيل Android، يمكنك إرسال اقتراح اختبار جديد يصف مشكلتك وطرق التحقّق منها. يضمن ذلك حلّ المشكلة في تحديث مستقبلي للجهاز، ويضمن أيضًا عدم حدوث الخطأ نفسه على أي أجهزة أخرى.
يمكنك الاطّلاع على عملية إرسال طلبات CTS للحصول على تعليمات مفصّلة حول كيفية إرسال مقترح الاختبار.