المحرّكات الأصلية والخاصة

بدء استخدام 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 بدءًا من الإصدار 7.0 (المستوى 24 من واجهة برمجة التطبيقات). لا تتوافق جميع أجهزة Android التي تعمل بالإصدار 7.0 من نظام التشغيل Android أو الإصدارات الأحدث مع Vulkan. عليك تحديد أجهزة Android المتوافقة مع Vulkan التي تتوافق معها لعبتك.

الاقتراحات

استخدِم المواصفات التالية كحدّ أدنى من المتطلبات لتوافق Vulkan:

  • يعمل الجهاز بالإصدار 10.0 من نظام التشغيل Android (المستوى 29 لواجهة برمجة التطبيقات) أو إصدار أحدث
  • أن يكون الجهاز متوافقًا مع الإصدار 1.1 أو إصدار أحدث من واجهة برمجة التطبيقات Vulkan
  • يجب أن يتضمّن الجهاز إمكانات وميزات أجهزة متوافقة مع الملف الشخصي الأساسي لنظام التشغيل Android لعام 2022

التوافق مع الأجهزة القديمة

إذا كانت لعبتك مصمَّمة لتعمل على مجموعة كبيرة من الأجهزة ذات مستويات مختلفة من إمكانات الرسومات، قد تحتاج إلى توفير الدعم للأجهزة الأقدم من تلك الموصى بها في اختيار الحد الأدنى من مواصفات الأجهزة لاستخدام Vulkan. قبل توفير إمكانية استخدام 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 في وقت التشغيل

تضمين عناوين 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 للتظليل (GLSL) كسلاسل نصية. استخدِم برنامج تجميع تظليل لتحويل الرمز المكتوب بلغة تظليل، مثل GLSL أو High-level Shader Language (HLSL)، إلى وحدات SPIR-V لاستخدامها مع Vulkan.

يمكن استخدام برنامج التجميع shaderc لتجميع برامج التظليل المكتوبة بلغة GLSL إلى SPIR-V. إذا كانت لعبتك تستخدم HLSL، يتيح DirectXShaderCompiler إخراج SPIR-V. عادةً، يتم تجميع برامج التظليل بلا إنترنت كجزء من عملية إنشاء مواد العرض في لعبتك، ويتم تضمين وحدات SPIR-V كجزء من مواد العرض في وقت التشغيل.

استدعاء واجهة برمجة تطبيقات Vulkan في وقت التشغيل

لاستدعاء واجهة برمجة تطبيقات Vulkan، يجب أن تحصل لعبتك على مؤشرات دالة لاستدعاءات واجهة برمجة تطبيقات Vulkan. أسهل طريقة لإجراء ذلك هي الربط بالمكتبة المشتركة libvulkan.so، والتي يتم تضمينها في حزمة تطوير البرامج (NDK) لنظام Android. يؤدي الربط بالمكتبة إلى حدوث عيبَين، هما: زيادة الحمل الزائد لتوزيع الدوال، وقيود على مؤشرات دوال 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 التالية:

  • 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 — الإصدار 7.0 من نظام التشغيل Android (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث

توافُق برنامج تشغيل Vulkan

لا يعني توفّر إصدار من واجهة برمجة تطبيقات Vulkan على منصة Android أنّ إصدار واجهة برمجة التطبيقات متوافق مع برنامج تشغيل Vulkan على الجهاز. قد لا يتوافق الجهاز الذي يعمل بالإصدار 13 من نظام التشغيل Android إلا مع الإصدار 1.1 من واجهة برمجة التطبيقات Vulkan.

عند تهيئة Vulkan، لا تطلب إصدارًا من واجهة برمجة التطبيقات أكبر من:

  • تمثّل هذه السمة الحد الأقصى لإصدار واجهة برمجة تطبيقات Vulkan لنظام التشغيل 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 الأساسي لعام 2022، استخدِم مكتبة واجهة برمجة التطبيقات المفتوحة المصدر لملفات تعريف Vulkan. يمكنك أيضًا تحليل ملف JSON الخاص بالملف الشخصي بنفسك والاستعلام عن إمكانات الجهاز باستخدام واجهات Vulkan API ذات الصلة لتحديد مدى توافق الملف الشخصي.

ملفات Vulkan الشخصية

يستخدم نظام التشغيل Android ملفات تعريف Vulkan التي تحدّد الميزات والإضافات المتاحة لكل الأجهزة التي تعمل بنظام التشغيل Android.

‫Android Baseline Profile (ABP) هو المحاولة الأولى لإنشاء Vulkan Profile. ABP2021 وABP2022 هما ملفان شخصيان يستندان إلى بيانات سابقة ويهدفان إلى تغطية أكثر من% 85 من الأجهزة النشطة في ذلك الوقت. لن يتم توفير أي إصدارات جديدة من ABP في المستقبل.

‫Vulkan Profiles for Android (VPA) هو ملف تعريف جديد يهدف إلى تلبية احتياجات مطوّري البرامج وتوفير ميزات متوافقة فور أن يتمكّن مطوّرو الأجهزة من توفيرها. VPA15_minimums هو الملف الشخصي الأول لنظام التشغيل Android 15، وسيتم توفير ملف VPA جديد كل عام لتغطية كل إصدار رئيسي من Android.

تنفيذ ميزة "مزامنة عرض اللقطات"

يُعدّ ضبط معدّل عرض اللقطات بشكل صحيح جزءًا أساسيًا من تقديم تجربة لعب عالية الجودة. تتضمّن "حزمة تطوير ألعاب Android" مكتبة Frame Pacing لمساعدة لعبتك في تحقيق أفضل معدّل لعدد اللقطات في الثانية. لمزيد من التفاصيل حول التنفيذ، يُرجى الاطّلاع على دمج أداة Android Frame Pacing في أداة العرض Vulkan.

لا تعتمد على المزامنة الضمنية ومعدّل عرض اللقطات

يتم استخدام vkAcquireNextImageKHR وvkQueuePresentKHR لإدارة سلسلة التبديل. تجنَّب الاعتماد على سلوك الحظر المحتمل للتطبيق العام أو مزامنة وحدة معالجة الرسومات.

يمكن أن يختلف سلوك الحظر الدقيق لهذه الدوال بشكل كبير في ما يلي:

  • أجهزة Android
  • برامج تشغيل وحدة معالجة الرسومات
  • حالات محرك العرض التقديمي (VkPresentModeKHR)

الغرض الوحيد من vkAcquireNextImageKHR هو الحصول على صورة قابلة للعرض، وقد يتم الحظر أو لا يتم. وبالمثل، تعمل الدالة vkQueuePresentKHR على وضع طلب في قائمة الانتظار لعرض صورة، وقد تحظر أو لا تحظر.

ولا توفّر أيّ من الدالتين ضمانات موثوقة لمزامنة مهام وحدة المعالجة المركزية غير المرتبطة أو عمليات وحدة معالجة الرسومات.

لضمان مزامنة قوية، استخدِم دائمًا عناصر Vulkan الأساسية الصريحة، مثل إشارات المرور لعمليات التبعية بين وحدات معالجة الرسومات (مثل العرض التقديمي)، والحواجز للمزامنة بين وحدة معالجة الرسومات ووحدة المعالجة المركزية (مثل معرفة وقت انتهاء العرض على وحدة المعالجة المركزية)، وأحداث أو حواجز خطوط الأنابيب لتنفيذ وحدة معالجة الرسومات وعمليات التبعية في الذاكرة بشكل أكثر دقة. يضمن استخدام المزامنة الواضحة سلوكًا يمكن توقّعه ويتجنّب الأخطاء الطفيفة الناتجة عن اختلافات التوقيت الخاصة بالتنفيذ والمتأصلة في منظومة Android المتنوعة للأجهزة.

تنفيذ عملية التدوير المُسبَق

يمكن عرض أجهزة Android في أوضاع متعددة. يمكن أن يختلف اتجاه الجهاز عن اتجاه سطح العرض. وعلى عكس OpenGL ES على Android، لا يتعامل Vulkan مع التناقضات بين الاثنين. للتعرّف على طريقة عمل عملية تغيير اتجاه الشاشة وأفضل طريقة للتعامل مع الاختلافات في اتجاه الشاشة عند استخدام Vulkan، يُرجى الاطّلاع على التعامل مع تدوير الجهاز باستخدام ميزة "التدوير المسبق" في Vulkan.

تحديد المشاكل في عرض Vulkan وحلّها وإنشاء ملف تعريف له

تتوفّر أدوات متعدّدة لمساعدتك في تشخيص مشاكل العرض ومشاكل الأداء المتعلّقة برمز العرض في Vulkan.

لمزيد من المعلومات حول أدوات تصحيح الأخطاء وإنشاء الملفات الشخصية في Vulkan، يُرجى الاطّلاع على قسم الأدوات والميزات المتقدّمة.

مراحل التحقّق من Vulkan

طبقات التحقّق من صحة Vulkan هي مكتبات وقت التشغيل التي يمكن تفعيلها لفحص طلباتك إلى واجهة برمجة تطبيقات Vulkan وتقديم تحذيرات أو أخطاء بشأن الاستخدام غير الصحيح أو غير الأمثل. لا تكون طبقات التحقّق هذه نشطة تلقائيًا، لأنّ عملية التحقّق تضيف حملًا زائدًا أثناء وقت التشغيل وتؤثر في أداء لعبتك. للحصول على معلومات حول كيفية استخدام طبقات التحقّق من الصحة مع لعبتك، يُرجى الاطّلاع على تصحيح الأخطاء باستخدام طبقة التحقّق من الصحة.

أدوات التقاط اللقطات

استخدِم أدوات التقاط اللقطات لتسجيل وإعادة تشغيل طلبات Vulkan API التي تم إجراؤها أثناء عرض إطار لعبة. تتيح لك هذه الأدوات ما يلي:

  • عرض معلومات حول موارد الرسومات النشطة وتمثيلات مرئية لها
  • الاطّلاع على تسلسل طلبات البيانات من واجهة برمجة التطبيقات التي تجريها لعبتك ومعرفة مَعلمات واجهة برمجة التطبيقات
  • استكشاف حالة مسار الرسومات في وقت طلب الرسم
  • عرض نتائج عرض ما يصل إلى طلب رسم معيّن في الإطار

استخدِم أداة 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-D) هي اختبارات يرسلها مطوّرو تطبيقات Android للتأكّد من أنّ أجهزة Android المستقبلية تستوفي حالات الاستخدام الخاصة بهم ويمكنها تشغيل تطبيقاتهم بسلاسة وبدون أخطاء.

إذا تمكّنت من رصد خطأ جديد في تطبيق Vulkan يؤثر في أي جهاز معيّن يعمل بنظام التشغيل Android، يمكنك إرسال اقتراح اختبار جديد يتضمّن وصفًا للمشكلة وطرق التحقّق منها. يضمن هذا الإجراء إصلاح المشكلة في تحديث مستقبلي للجهاز، كما يضمن عدم حدوث الخطأ نفسه على أي أجهزة أخرى.

يمكنك الاطّلاع على عملية إرسال اختبارات CTS للحصول على تعليمات مفصّلة حول كيفية إرسال اقتراح الاختبار.