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 टूल की रिलीज़ में पैकेज की गई होती है. किसी भी खास एनडीके वर्शन में सिर्फ़ 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 एपीआई वर्शन के लिए Android प्लैटफ़ॉर्म, इस बात की गारंटी नहीं देता कि डिवाइस के Vulkan ड्राइवर के साथ एपीआई वर्शन काम करता है. Android 13 वाले डिवाइस पर, Vulkan API के सिर्फ़ 1.1 वर्शन का इस्तेमाल किया जा सकता है.
Vulkan को शुरू करते समय, एपीआई के ऐसे वर्शन का अनुरोध न करें जो इनसे ज़्यादा हो:
- डिवाइस पर इस्तेमाल किए जा रहे Android वर्शन के लिए, Vulkan API का ज़्यादा से ज़्यादा वर्शन
- vkEnumerateInstanceVersion से रिपोर्ट किया गया Vulkan API वर्शन
- Vulkan एपीआई वर्शन को
apiVersion
प्रॉपर्टी की मदद से Vk {2/}DeviceProperties स्ट्रक्चर की प्रॉपर्टी से रिपोर्ट किया गया है
डिवाइस पर काम करने वाले 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 में फ़्रेम पेसिंग लाइब्रेरी शामिल होती है. इससे आपके गेम को फ़्रेम पेसिंग को ऑप्टिमाइज़ करने में मदद मिलती है. लागू करने के बारे में ज़्यादा जानकारी के लिए, Android फ़्रेम पेसिंग को अपने Vulkan रेंडरर में इंटिग्रेट करना लेख देखें.
प्री-रोटेशन लागू करना
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 जीपीयू इंस्पेक्टर, वेंडर टूल से अलग है. यह अलग-अलग वेंडर के कई जीपीयू के साथ काम करता है. हालांकि, Android जीपीयू इंस्पेक्टर पुराने Android डिवाइसों के साथ काम नहीं करता और हो सकता है कि यह सभी नए डिवाइसों के साथ काम न करे.
CTS-D की मदद से, Vulkan टेस्टिंग को बेहतर बनाना
Android डिवाइस बनाने वाली कंपनियां, Compatibility Test Suite (CTS) का इस्तेमाल करके यह पक्का करती हैं कि उनके डिवाइस, Android के साथ काम करते हों. डेवलपर के लिए उपलब्ध सीटीएस (सीटीएस-डी), Android ऐप्लिकेशन डेवलपर के सबमिट किए गए टेस्ट होते हैं. इनसे यह पक्का किया जाता है कि आने वाले समय में, Android डिवाइसों पर ऐप्लिकेशन के इस्तेमाल के उदाहरण सही तरीके से काम करें और ऐप्लिकेशन बिना किसी गड़बड़ी के आसानी से चलें.
अगर आपको अपने Vulkan ऐप्लिकेशन में कोई नया बग मिलता है, जो Android पर काम करने वाले किसी डिवाइस पर असर डालता है, तो टेस्ट का नया प्रस्ताव सबमिट करें. इसमें अपनी समस्या और उसे जांचने के तरीकों के बारे में बताएं. इससे यह पक्का होता है कि डिवाइस के लिए आने वाले समय में किए जाने वाले अपडेट में, यह समस्या ठीक हो जाएगी. साथ ही, यह भी पक्का होता है कि यह गड़बड़ी किसी दूसरे डिवाइस में नहीं होगी.
जांच का प्रस्ताव सबमिट करने का तरीका जानने के लिए, सीटीएस सबमिट करने की प्रोसेस देखें.