स्थानीय और मालिकाना इंजन

Android पर Vulkan का इस्तेमाल शुरू करना

Vulkan, Android पर लो-लेवल ग्राफ़िक्स एपीआई है. Vulkan, उन गेम के लिए बेहतरीन परफ़ॉर्मेंस देता है जो अपना गेम इंजन और रेंडरर लागू करते हैं.

अपने गेम इंजन में Vulkan को लागू करने के लिए, आपको ये काम करने होंगे:

  • यह पता लगाना कि Vulkan के साथ किन Android डिवाइसों का इस्तेमाल करना है
  • पुराने Android डिवाइसों के साथ काम करने की सुविधा के फ़ायदे और नुकसान
  • अपने Android बिल्ड टारगेट में Vulkan जोड़ना
  • Vulkan के लिए SPIR-V बनाने के लिए, कोई शेडर कंपाइलर चुनना
  • रनटाइम के दौरान, उपलब्ध Vulkan API वर्शन का पता लगाना
  • Vulkan प्रोफ़ाइलों, फ़्रेम पेसिंग, और प्री-रोटेशन की मदद से, Vulkan रेंडरिंग ऑपरेशन को ऑप्टिमाइज़ करने का तरीका जानें
  • डीबग करने और परफ़ॉर्मेंस का विश्लेषण करने के लिए, ग्राफ़िक टूल चुनना
    ध्यान दें: Unity या Unreal गेम इंजन के साथ Android पर Vulkan का इस्तेमाल करने के बारे में जानने के लिए, यह लेख पढ़ें:
  • Unity पर Vulkan
  • Unreal पर Vulkan

Vulkan के लिए, डिवाइस की कम से कम ज़रूरी शर्तें चुनना

Vulkan, Android 7.0 (एपीआई लेवल 24) से शुरू होने वाले Android वर्शन पर उपलब्ध है. Android 7.0 या इसके बाद के वर्शन पर चलने वाले सभी Android डिवाइसों पर, Vulkan काम नहीं करता. आपको यह तय करना होगा कि आपका गेम, Vulkan API के साथ काम करने वाले किन Android डिवाइसों पर काम करता है.

सुझाव

Vulkan के साथ काम करने के लिए, यहां दी गई ज़रूरी शर्तों का इस्तेमाल करें:

  • डिवाइस पर Android 10.0 (एपीआई लेवल 29) या उसके बाद का वर्शन हो
  • डिवाइस पर Vulkan API का वर्शन 1.1 या इसके बाद का वर्शन काम करता हो
  • डिवाइस में 2022 की Android बेसलाइन प्रोफ़ाइल के साथ काम करने वाली हार्डवेयर क्षमताएं और सुविधाएं हों

पुराने डिवाइसों के लिए सहायता

अगर आपके गेम को अलग-अलग लेवल के ग्राफ़िक्स की सुविधाओं वाले कई डिवाइसों पर चलाने के लिए डिज़ाइन किया गया है, तो हो सकता है कि आपको Vulkan के लिए डिवाइसों की ज़रूरी खास बातें चुनें में सुझाए गए डिवाइसों से पुराने डिवाइसों पर भी गेम चलाने की सुविधा देनी पड़े. पुराने डिवाइसों के लिए सहायता बनाने से पहले, यह आकलन करें कि Vulkan आपके गेम के लिए फ़ायदेमंद है या नहीं. जिन गेम में बहुत ज़्यादा ड्रॉ कॉल होते हैं और जो OpenGL ES का इस्तेमाल करते हैं उनमें ड्राइवर का ओवरहेड काफ़ी ज़्यादा हो सकता है. इसकी वजह यह है कि OpenGL ES में ड्रॉ कॉल करने की लागत ज़्यादा होती है. ये गेम, अपने फ़्रेम टाइम का ज़्यादातर हिस्सा ग्राफ़िक ड्राइवर में खर्च करने की वजह से, सीपीयू के हिसाब से काम नहीं कर पाते. OpenGL ES से Vulkan पर स्विच करने से, गेम में सीपीयू और बिजली के इस्तेमाल में काफ़ी कमी आ सकती है. यह तरीका खास तौर पर तब कारगर होता है, जब आपके गेम में ऐसे जटिल सीन हों जिनमें ड्रॉ कॉल को कम करने के लिए, इंस्टेंसिंग का असरदार तरीके से इस्तेमाल नहीं किया जा सकता. पुराने डिवाइसों को टारगेट करते समय, फ़ॉलबैक के तौर पर OpenGL ES रेंडरिंग की सुविधा शामिल करें. ऐसा इसलिए, क्योंकि टारगेट किए गए डिवाइसों की सूची में मौजूद कुछ डिवाइसों में, Vulkan की ऐसी सुविधाएं हो सकती हैं जिनसे आपका गेम भरोसेमंद तरीके से नहीं चल सकता.

हो सकता है कि आप Vulkan की सुविधा वाले पुराने डिवाइसों के लिए ऐप्लिकेशन उपलब्ध न कराना चाहें, क्योंकि इनमें परफ़ॉर्मेंस और सुविधाओं की कमी होती है या इनमें स्थिरता से जुड़ी समस्याएं होती हैं.

परफ़ॉर्मेंस और सुविधाएं

हो सकता है कि Vulkan API के साथ काम करने वाले पुराने Android डिवाइसों पर, रेंडरिंग की परफ़ॉर्मेंस ठीक से न हो या आपके गेम को चलाने के लिए ज़रूरी सुविधाओं के लिए, हार्डवेयर की सुविधा न हो. ऐसा खास तौर पर तब हो सकता है, जब आपके गेम में हाई फ़िडेलिटी वाले ग्राफ़िक हों और Android पर सिर्फ़ Vulkan एपीआई को टारगेट किया जा रहा हो. कई पुराने डिवाइसों में, Vulkan API का सिर्फ़ 1.0.3 वर्शन काम करता है. साथ ही, इनमें अक्सर आधुनिक हार्डवेयर पर उपलब्ध, ज़्यादा इस्तेमाल किए जाने वाले Vulkan एक्सटेंशन मौजूद नहीं होते.

ऐप्लिकेशन को क्रैश या फ़्रीज़ होने जैसी समस्याओं से बचाना

पुराने Android डिवाइसों में, Vulkan ड्राइवर के पुराने वर्शन का इस्तेमाल किया जा सकता है. इन ड्राइवर वर्शन में ऐसी गड़बड़ियां हो सकती हैं जिनसे आपके गेम की परफ़ॉर्मेंस पर असर पड़ सकता है. ड्राइवर के गड़बड़ियों को ठीक करने के लिए, टेस्टिंग और इंजीनियरिंग में काफ़ी समय लग सकता है.

अपने प्रोजेक्ट में Vulkan जोड़ना

अपने प्रोजेक्ट में Vulkan जोड़ने के लिए, आपको:

  • Vulkan API हेडर शामिल करना
  • शेडर कोड को SPIR-V में कंपाइल करना
  • रनटाइम के दौरान Vulkan API को कॉल करना

Vulkan API हेडर शामिल करना

Vulkan का इस्तेमाल करने वाले कोड को कंपाइल करने के लिए, आपके गेम में Vulkan API हेडर फ़ाइलें शामिल होनी चाहिए. Vulkan हेडर की कॉपी, Android NDK में या Vulkan SDK टूल की रिलीज़ में पैकेज की गई होती है. किसी भी NDK वर्शन में, सिर्फ़ NDK रिलीज़ के समय उपलब्ध Vulkan हेडर शामिल होते हैं. अगर आपको NDK के Vulkan हेडर का इस्तेमाल करना है, तो NDK के 25 या उसके बाद के वर्शन का इस्तेमाल करें. इसमें Vulkan के 1.3 वर्शन के साथ काम करने वाली हेडर फ़ाइलें शामिल हैं. Vulkan SDK टूल में हेडर का सबसे नया वर्शन होता है.

शेडर कोड को SPIR-V में कंपाइल करना

Vulkan API को उम्मीद है कि शेडर प्रोग्राम, SPIR-V बाइनरी इंटरमीडिएट फ़ॉर्मैट में उपलब्ध कराए जाएंगे. यह तरीका, OpenGL ES से अलग है. इसमें OpenGL Shading Language (GLSL) में लिखे गए सोर्स कोड को टेक्स्ट स्ट्रिंग के तौर पर सबमिट किया जा सकता है. GLSL या हाई-लेवल शेडर लैंग्वेज (HLSL) जैसी शेडर लैंग्वेज में लिखे गए कोड को, Vulkan के साथ इस्तेमाल करने के लिए SPIR-V मॉड्यूल में कंपाइल करने के लिए, शेडर कंपाइलर का इस्तेमाल करें.

shaderc कंपाइलर का इस्तेमाल, GLSL में लिखे गए शेडर प्रोग्राम को SPIR-V में कंपाइल करने के लिए किया जा सकता है. अगर आपका गेम HLSL का इस्तेमाल करता है, तो DirectXShaderCompiler, SPIR-V आउटपुट के साथ काम करता है. आम तौर पर, गेम के लिए ऐसेट बनाने की प्रोसेस के तहत, शेडर प्रोग्राम को ऑफ़लाइन कॉम्पाइल किया जाता है. साथ ही, रनटाइम ऐसेट के हिस्से के तौर पर SPIR-V मॉड्यूल शामिल किए जाते हैं.

रनटाइम के दौरान Vulkan API को कॉल करना

Vulkan एपीआई को कॉल करने के लिए, आपके गेम को Vulkan एपीआई कॉल के लिए फ़ंक्शन पॉइंटर चाहिए. ऐसा करने का सबसे आसान तरीका, libvulkan.so शेयर की गई लाइब्रेरी से लिंक करना है. यह लाइब्रेरी, Android NDK में शामिल होती है. लाइब्रेरी के साथ लिंक करने की दो कमियां हैं: फ़ंक्शन डिस्पैच का अतिरिक्त ओवरहेड और उन सीमाओं पर Vulkan API फ़ंक्शन पॉइंटर अपने-आप हल हो जाते हैं.

Vulkan API फ़ंक्शन को कॉल करने पर, कंट्रोल एक डिस्पैच टेबल से होकर गुज़रता है. इसे Vulkan लोडर नाम के कंस्ट्रक्ट से मैनेज किया जाता है. Android, LunarG लोडर के बजाय अपने Vulkan लोडर का इस्तेमाल करता है. यह लोडर सिस्टम, Vulkan API की लेयर आर्किटेक्चर का हिस्सा है. बिल्ड के समय सिस्टम लाइब्रेरी से लिंक करने पर, किसी एपीआई कॉल के लिए एक और डिस्पैच लेवल बन जाता है. ओवरहेड कम है, लेकिन Vulkan कॉल की संख्या ज़्यादा होने पर, यह गेम में दिख सकता है.

आम तौर पर, सिस्टम लाइब्रेरी सिर्फ़ उन Vulkan फ़ंक्शन के पॉइंटर को हल करती है जिन्हें कोर एपीआई का हिस्सा माना जाता है. Vulkan में कई एक्सटेंशन होते हैं, जो Vulkan के अन्य फ़ंक्शन तय करते हैं. इनमें से कई फ़ंक्शन, सिस्टम लाइब्रेरी से अपने-आप हल नहीं होते. इन Vulkan फ़ंक्शन का इस्तेमाल करने से पहले, आपको मैन्युअल तरीके से पॉइंटर को हल करना होगा.

इन समस्याओं को कम करने के लिए, उन सभी Vulkan फ़ंक्शन के पॉइंटर को डाइनैमिक तौर पर हल करें जिनका इस्तेमाल आपको रनटाइम के दौरान करना है. ऐसा करने का एक तरीका, volk जैसी ओपन सोर्स मेटा-लोडर लाइब्रेरी का इस्तेमाल करना है. इस काम के लिए, AGDKTunnel सैंपल गेम में volk को इंटिग्रेट किया गया है. अगर आपने मेटा-लोडर लाइब्रेरी का इस्तेमाल किया है, तो अपनी बिल्ड स्क्रिप्ट में libvulkan.soशेयर की गई लाइब्रेरी के साथ लिंक न करें.

Vulkan API का उपलब्ध वर्शन तय करना

Android, Vulkan API के इन वर्शन के साथ काम करता है:

  • 1.0.3
  • 1.1
  • 1.3

किसी डिवाइस पर Vulkan API का सबसे नया वर्शन, Android वर्शन और Vulkan ड्राइवर के साथ काम करने की सुविधा के आधार पर तय होता है.

Android वर्शन

Vulkan API के किसी वर्शन के लिए प्लैटफ़ॉर्म का इस्तेमाल करने की सुविधा, Android के कम से कम वर्शन (एपीआई लेवल) पर निर्भर करती है:

  • 1.3 — Android 13.0 (एपीआई लेवल 33) और उसके बाद के वर्शन
  • 1.1 — Android 10.0 (एपीआई लेवल 29) और उसके बाद के वर्शन
  • 1.0.3 — Android 7.0 (एपीआई लेवल 24) और इसके बाद के वर्शन

Vulkan ड्राइवर के साथ काम करना

किसी Vulkan API वर्शन के लिए Android प्लैटफ़ॉर्म के काम करने का मतलब यह नहीं है कि डिवाइस के Vulkan ड्राइवर पर भी वह वर्शन काम करेगा. हो सकता है कि Android 13 पर चलने वाले डिवाइस पर, Vulkan API का सिर्फ़ 1.1 वर्शन काम करे.

Vulkan को शुरू करते समय, एपीआई के ऐसे वर्शन का अनुरोध न करें जो इनसे ज़्यादा हो:

  • डिवाइस पर इस्तेमाल किए जा रहे Android वर्शन के लिए, Vulkan API का ज़्यादा से ज़्यादा वर्शन
  • vkEnumerateInstanceVersion से रिपोर्ट किया गया Vulkan API वर्शन
  • VkPhysicalDeviceProperties स्ट्रक्चर की apiVersion प्रॉपर्टी से रिपोर्ट किया गया Vulkan API वर्शन

डिवाइस पर काम करने वाले 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 डिवाइस में इन सुविधाओं का होना ज़रूरी है. यह पता लगाने के लिए कि कोई डिवाइस, 2022 की Android बेसलाइन प्रोफ़ाइल जैसी किसी खास Vulkan प्रोफ़ाइल के साथ काम करता है या नहीं, ओपन सोर्स Vulkan प्रोफ़ाइल एपीआई लाइब्रेरी का इस्तेमाल करें. प्रोफ़ाइल JSON फ़ाइल को खुद भी पार्स किया जा सकता है. साथ ही, प्रोफ़ाइल के साथ डिवाइस के काम करने की क्षमता का पता लगाने के लिए, काम के Vulkan एपीआई का इस्तेमाल करके, डिवाइस की क्षमताओं के बारे में क्वेरी की जा सकती है.

Vulkan प्रोफ़ाइलें

Android, Vulkan प्रोफ़ाइलों का इस्तेमाल कर रहा है. इससे यह तय होता है कि Android चलाने वाले हर डिवाइस के लिए कौनसी सुविधाएं और एक्सटेंशन उपलब्ध हैं.

Android Baseline Profile (ABP), Vulkan Profile बनाने की पहली कोशिश है. ABP2021 और ABP2022, ऐसी प्रोफ़ाइलें हैं जिनका मकसद, उस समय के 85% से ज़्यादा चालू डिवाइसों को कवर करना है. आने वाले समय में कोई नया एबीपी नहीं होगा.

Android के लिए Vulkan प्रोफ़ाइलें (VPA), एक नई प्रोफ़ाइल है. इसका मकसद, सॉफ़्टवेयर डेवलपर की ज़रूरतों को पूरा करना और हार्डवेयर डेवलपर के डिलीवर करने के बाद, एक जैसी सुविधाएं देना है. VPA15_minimums, Android 15 के लिए पहली प्रोफ़ाइल है. हर साल एक नया VPA उपलब्ध होगा, ताकि Android के हर बड़े वर्शन को कवर किया जा सके.

फ़्रेम पेसिंग लागू करना

अच्छी क्वालिटी का गेमप्ले अनुभव देने के लिए, फ़्रेम पेसिंग सही होना ज़रूरी है. Android Game Development Kit में फ़्रेम पेसिंग लाइब्रेरी शामिल होती है. इससे आपके गेम को फ़्रेम पेसिंग को ऑप्टिमाइज़ करने में मदद मिलती है. लागू करने के बारे में ज़्यादा जानकारी के लिए, अपने Vulkan रेंडरर में Android फ़्रेम पेसिंग को इंटिग्रेट करना लेख पढ़ें.

प्री-रोटेशन लागू करना

Android डिवाइसों पर, इमेज कई ओरिएंटेशन में दिख सकती हैं. डिवाइस का ओरिएंटेशन, रेंडर किए जा रहे प्लैटफ़ॉर्म के ओरिएंटेशन से अलग हो सकता है. Android पर OpenGL ES के उलट, Vulkan इन दोनों के बीच के अंतर को मैनेज नहीं करता. ऑरिएंटेशन की प्रोसेस के काम करने का तरीका और Vulkan का इस्तेमाल करते समय ऑरिएंटेशन में होने वाले बदलावों को मैनेज करने का सबसे अच्छा तरीका जानने के लिए, Vulkan के प्री-रोटेशन की सुविधा का इस्तेमाल करके डिवाइस के रोटेशन को मैनेज करना लेख पढ़ें.

Vulkan रेंडरिंग की समस्या हल करना और उसकी प्रोफ़ाइल बनाना

Vulkan रेंडरिंग कोड की परफ़ॉर्मेंस और रेंडरिंग से जुड़ी समस्याओं का पता लगाने के लिए, कई टूल उपलब्ध हैं.

Vulkan के डीबगिंग और प्रोफ़ाइलिंग टूल के बारे में ज़्यादा जानने के लिए, टूल और बेहतर सुविधाएं सेक्शन देखें.

Vulkan की पुष्टि करने वाली लेयर

Vulkan की पुष्टि करने वाली लेयर, रनटाइम लाइब्रेरी होती हैं. इन्हें चालू करके, Vulkan API को किए जाने वाले कॉल की जांच की जा सकती है. साथ ही, गलत या सही तरीके से इस्तेमाल न करने पर चेतावनियां या गड़बड़ियां दिखाई जा सकती हैं. पुष्टि करने वाली ये लेयर डिफ़ॉल्ट रूप से चालू नहीं होतीं, क्योंकि पुष्टि करने की प्रोसेस से रनटाइम ओवरहेड जुड़ता है और आपके गेम की परफ़ॉर्मेंस पर असर पड़ता है. अपने गेम में पुष्टि करने वाली लेयर इस्तेमाल करने के तरीके के बारे में जानने के लिए, पुष्टि करने वाली लेयर की मदद से डीबग करना लेख पढ़ें.

फ़्रेम कैप्चर करने वाले टूल

गेम फ़्रेम के दौरान किए गए Vulkan API कॉल को रिकॉर्ड और फिर से चलाने के लिए, फ़्रेम कैप्चर टूल का इस्तेमाल करें. इन टूल की मदद से:

  • ऐक्टिव ग्राफ़िक संसाधनों की जानकारी और विज़ुअलाइज़ेशन देखना
  • अपने गेम से किए गए एपीआई कॉल का क्रम देखें और एपीआई पैरामीटर देखें
  • ड्रॉ कॉल के समय ग्राफ़िक्स पाइपलाइन की स्थिति को एक्सप्लोर करना
  • फ़्रेम में किसी खास ड्रॉ कॉल तक रेंडर करने के नतीजों को विज़ुअलाइज़ करना

Android पर चल रहे गेम के फ़्रेम कैप्चर करने के लिए, ओपन सोर्स RenderDoc टूल का इस्तेमाल करें. RenderDoc, Vulkan और OpenGL ES, दोनों के फ़्रेम कैप्चर करने की सुविधा देता है.

Android GPU Inspector (AGI) का इस्तेमाल, Vulkan फ़्रेम कैप्चर करने के लिए भी किया जा सकता है.

परफ़ॉर्मेंस का विश्लेषण करने वाले टूल

परफ़ॉर्मेंस का विश्लेषण करने वाले टूल का इस्तेमाल करके, अपने गेम में रेंडरिंग से जुड़ी उन समस्याओं की जांच करें जिनकी वजह से फ़्रेम रेट कम हो जाता है. जीपीयू के अलग-अलग वेंडर, ऐसे टूल उपलब्ध कराते हैं जिनका मकसद आपके गेम की प्रोफ़ाइल बनाना और उनके जीपीयू के आर्किटेक्चर के हिसाब से परफ़ॉर्मेंस का डेटा उपलब्ध कराना होता है. अलग-अलग वेंडर के जीपीयू पर रेंडरिंग करते समय, आपके गेम की परफ़ॉर्मेंस की विशेषताएं और समस्याएं काफ़ी अलग-अलग हो सकती हैं. यहां तक कि एक ही वेंडर के अलग-अलग जीपीयू जनरेशन पर भी ऐसा हो सकता है.

परफ़ॉर्मेंस डेटा इकट्ठा करने और उसका विश्लेषण करने के लिए, Android GPU Inspector का भी इस्तेमाल किया जा सकता है. वेंडर टूल के उलट, Android GPU Inspector, अलग-अलग वेंडर के कई जीपीयू के साथ काम करता है. हालांकि, Android GPU Inspector, पुराने Android डिवाइसों पर काम नहीं करता. ऐसा हो सकता है कि यह सभी नए डिवाइसों पर काम न करे.

CTS-D की मदद से, Vulkan टेस्टिंग को बेहतर बनाना

Android डिवाइस बनाने वाली कंपनियां, Compatibility Test Suite (CTS) का इस्तेमाल करके यह पक्का करती हैं कि उनके डिवाइस, Android के साथ काम करते हों. डेवलपर के लिए उपलब्ध सीटीएस (सीटीएस-डी), Android ऐप्लिकेशन डेवलपर के सबमिट किए गए टेस्ट होते हैं. इनसे यह पक्का किया जाता है कि आने वाले समय में, Android डिवाइसों पर ऐप्लिकेशन के इस्तेमाल के उदाहरण सही तरीके से काम करें. साथ ही, ऐप्लिकेशन बिना किसी गड़बड़ी के आसानी से चल सकें.

अगर आपको अपने Vulkan ऐप्लिकेशन में कोई नया बग मिलता है, जो Android पर काम करने वाले किसी डिवाइस पर असर डालता है, तो टेस्ट का नया प्रस्ताव सबमिट करें. इसमें अपनी समस्या और उसे जांचने के तरीकों के बारे में बताएं. इससे यह पक्का होता है कि डिवाइस के लिए आने वाले समय में होने वाले अपडेट में, यह समस्या ठीक हो जाएगी. साथ ही, यह भी पक्का होता है कि यह गड़बड़ी किसी दूसरे डिवाइस में नहीं होगी.

जांच का प्रस्ताव सबमिट करने का तरीका जानने के लिए, सीटीएस सबमिट करने की प्रोसेस देखें.