Android के लिए, Godot Engine Vulkan ऑप्टिमाइज़ेशन

Godot Engine के मैस्कॉट की इमेज

खास जानकारी

Godot Engine, एक लोकप्रिय मल्टी-प्लैटफ़ॉर्म ओपन-सोर्स गेम इंजन है. इसमें Android के लिए बेहतर सहायता मिलती है. Godot का इस्तेमाल, किसी भी तरह के गेम बनाने के लिए किया जा सकता है. साथ ही, इसमें 2D और 3D, दोनों तरह के ग्राफ़िक इस्तेमाल किए जा सकते हैं. Godot के वर्शन 4 में, बेहतर क्वालिटी वाले ग्राफ़िक के लिए ऐडवांस सुविधाओं वाला नया रेंडरिंग सिस्टम जोड़ा गया है. Godot 4 रेंडरर को, Vulkan जैसे आधुनिक ग्राफ़िक्स एपीआई के लिए डिज़ाइन किया गया है.

Godot Foundation ने The Forge Interactive के ग्राफ़िक ऑप्टिमाइज़ेशन विशेषज्ञों की मदद ली. साथ ही, Godot 4 Vulkan रेंडरर का विश्लेषण करने और उसे बेहतर बनाने के लिए, Google के साथ मिलकर काम किया. इसके बाद, उन ऑप्टिमाइज़ेशन को प्रोजेक्ट के रिपॉज़िटरी में मर्ज किया गया. ऑप्टिमाइज़ेशन की मदद से, डेवलपर Android पर कस्टम Vulkan रेंडरर को बेहतर बना सकते हैं.

ऑप्टिमाइज़ेशन का तरीका और नतीजे

ऑप्टिमाइज़ेशन की प्रोसेस में, Godot में दो अलग-अलग 3D सीन का इस्तेमाल, बेंचमार्किंग के टारगेट के तौर पर किया गया. ऑप्टिमाइज़ेशन के हर चरण के दौरान, कई डिवाइसों पर सीन के रेंडर होने में लगने वाला समय मेज़र किया गया. शामिल किए जाने की ज़रूरी शर्तों के मुताबिक, रेंडरर में किए गए बदलावों से, जांचे गए कम से कम कुछ डिवाइसों पर परफ़ॉर्मेंस में सुधार दिखना चाहिए. साथ ही, किसी भी डिवाइस पर परफ़ॉर्मेंस में गिरावट नहीं आनी चाहिए.

टेस्टिंग में, Android के कई लोकप्रिय GPU आर्किटेक्चर का इस्तेमाल किया गया था. कई ऑप्टिमाइज़ेशन से सामान्य सुधार हुए, लेकिन कुछ ऑप्टिमाइज़ेशन का खास GPU आर्किटेक्चर पर ज़्यादा असर पड़ा. ऑप्टिमाइज़ेशन के सभी कामों के नतीजे के तौर पर, जीपीयू फ़्रेम टाइम में 10% से 20% की कमी आई है.

Vulkan का सामान्य ऑप्टिमाइज़ेशन

Forge ने परफ़ॉर्मेंस को बेहतर बनाने के लिए, Godot Vulkan रेंडरिंग बैकएंड पर सामान्य आर्किटेक्चर रीफ़ैक्टरिंग की. साथ ही, कॉन्टेंट रेंडरिंग की बढ़ती मांग के हिसाब से बैकएंड को स्केल करने में मदद की. ये ऑप्टिमाइज़ेशन, मोबाइल हार्डवेयर के लिए खास तौर पर नहीं किए गए हैं. हालांकि, इनसे Godot Vulkan प्लैटफ़ॉर्म को फ़ायदा मिलता है.

डाइनैमिक यूबीओ ऑफ़सेट की सुविधा

जब किसी ऐसे डिस्क्रिप्टर सेट को बाइंड किया जाता है जिसमें डाइनैमिक यूनिफ़ॉर्म बफ़र ऑब्जेक्ट (UBO) होता है, तो Vulkan, UBO में डाइनैमिक ऑफ़सेट को बाइंड पैरामीटर में तय करने की अनुमति देता है. इस सुविधा का इस्तेमाल, एक से ज़्यादा रेंडरिंग ऑपरेशन के लिए डेटा को एक ही यूबीओ में पैक करने के लिए किया जा सकता है. साथ ही, शेडर के लिए सही डेटा चुनने के लिए, डिस्क्रिप्टर सेट को अलग डाइनैमिक ऑफ़सेट के साथ फिर से बांधें. Godot Vulkan रेंडरर को अपडेट किया गया है, ताकि ऑफ़सेट को हमेशा शून्य पर शुरू करने के बजाय, डाइनैमिक ऑफ़सेट का इस्तेमाल किया जा सके. इस सुधार की मदद से, आने वाले समय में परफ़ॉर्मेंस को बेहतर बनाया जा सकेगा.

लीनियर डिस्क्रिप्टर सेट पूल

पहले, Godot Vulkan रेंडरर में डिफ़ॉल्ट तौर पर, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT फ़्लैग का इस्तेमाल करके सभी डिस्क्रिप्टर सेट पूल बनाए जाते थे. इसका मतलब है कि डिस्क्रिप्टर सेट के ऐलोकेशन को पूल में वापस लाया जा सकता था और पूल से फिर से ऐलोकेशन किया जा सकता था. इस मोड में, डिस्क्रिप्टर सेट पूल की तुलना में ज़्यादा ओवरहेड होता है. डिस्क्रिप्टर सेट पूल में, सिर्फ़ लीनियर ऐलोकेशन की अनुमति होती है. इसके बाद, पूल को पूरी तरह से रीसेट किया जाता है.

जहां भी संभव हो, डिस्क्रिप्टर सेट पूल अब VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT सेट किए बिना लीनियर पूल के तौर पर बनाए जाते हैं. इसके बाद, ज़रूरत पड़ने पर लीनियर पूल को पूरी तरह से रीसेट किया जाता है. इस काम में, बॅच डिस्क्रिप्टर सेट बाइंडिंग के लिए, ज़रूरत पड़ने पर अतिरिक्त ऑप्टिमाइज़ेशन भी शामिल है. इससे vkCmdBindDescriptorSets() को अलग-अलग कॉल करने की संख्या कम हो जाती है.

अपरिवर्तनीय सैंपलर की सुविधा

सैंपलिंग कॉन्फ़िगरेशन डेटा वाले सैंपलर ऑब्जेक्ट, आम तौर पर डिस्क्रिप्टर सेट डेटा के हिस्से के तौर पर बाउंड होते हैं. इस तरीके से, डिस्क्रिप्टर सेट डेटा में सैंपलर ऑब्जेक्ट को डाइनैमिक तौर पर बदला जा सकता है. Vulkan में, ऐसे सैंपलर का भी इस्तेमाल किया जा सकता है जिनमें बदलाव नहीं किया जा सकता. ये सैंपलर, सैंपलर डेटा को सीधे डिस्क्रिप्टर सेट लेआउट में एन्कोड करते हैं. डिस्क्रिप्टर सेट और पाइपलाइन स्टेटस बनाते समय, सैंपलर कॉन्फ़िगरेशन को बांध दिया जाता है. इसे बनाने के बाद, इसमें बदलाव नहीं किया जा सकता.

बदलाव न किए जा सकने वाले सैंपलर, अलग-अलग सैंपलर ऑब्जेक्ट को मैनेज और बांधने की ज़रूरत नहीं होती. Godot Vulkan रेंडरर को अपडेट किया गया है, ताकि बदले न जा सकने वाले सैंपलर का इस्तेमाल किया जा सके. साथ ही, सैंपलर के इस्तेमाल को बदला गया है, ताकि जहां भी संभव हो वहां बदले न जा सकने वाले सैंपलर का इस्तेमाल किया जा सके.

मोबाइल पर फ़ोकस करने वाला ऑप्टिमाइज़ेशन

मोबाइल ग्राफ़िक्स हार्डवेयर पर रेंडरिंग की परफ़ॉर्मेंस को बेहतर बनाने के लिए, अन्य ऑप्टिमाइज़ेशन लागू किए गए थे. आम तौर पर, ये ऑप्टिमाइज़ेशन, डिवाइस के अलग-अलग आर्किटेक्चर डिज़ाइन की वजह से, डेस्कटॉप क्लास के ग्राफ़िक्स हार्डवेयर के लिए काम के नहीं होते.

ऑप्टिमाइज़ेशन में ये शामिल हैं:

  • बड़े पुश कॉन्स्टेंट के इस्तेमाल को बदलना
  • लेज़ी बफ़र ऐलोकेशन
  • वीडियो को लगातार बफ़र करने की सुविधा
  • एएसटीसी डिकोड मोड में बदलाव
  • स्क्रीन को पहले से घुमाना

बड़े पुश कॉन्स्टेंट के इस्तेमाल को बदलना

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

Android डिवाइसों पर टेस्टिंग के दौरान, 16 बाइट से ज़्यादा के पॉज़िशन अपडेट को यूनिफ़ॉर्म बफ़र से बदलकर परफ़ॉर्मेंस को बेहतर बनाया गया. जिन शेडर में 16 बाइट या उससे कम कॉन्स्टेंट डेटा का इस्तेमाल किया गया था वे पुश कॉन्स्टेंट के साथ बेहतर परफ़ॉर्म करते थे. परफ़ॉर्मेंस के अलावा, कुछ ग्राफ़िक हार्डवेयर में यूनिफ़ॉर्म बफ़र के लिए, कम से कम 64-बाइट अलाइनमेंट होता है. इससे पुश कॉन्स्टेंट का इस्तेमाल करने की तुलना में, इस्तेमाल न किए गए पैडिंग की वजह से मेमोरी की परफ़ॉर्मेंस खराब होती है.

लेज़ी बफ़र ऐलोकेशन

ज़्यादातर मोबाइल ग्राफ़िक हार्डवेयर, टाइल-आधारित डिफ़र्ड रेंडरिंग (टीबीडीआर) के आर्किटेक्चर का इस्तेमाल करते हैं. टीबीडीआर का इस्तेमाल करने वाले जीपीयू, बड़ी स्क्रीन के हिस्से को छोटी टाइल के ग्रिड में बांट देते हैं और हर टाइल के हिसाब से रेंडर करते हैं. हर टाइल के लिए, थोड़ी सी तेज़ रफ़्तार वाली रैम का इस्तेमाल किया जाता है. जीपीयू, टाइल को रेंडर करते समय इस स्टोरेज का इस्तेमाल करता है. टीबीडीआर की मदद से, ऐसे रेंडर टारगेट पूरी तरह से टाइल रैम में रह सकते हैं जिन्हें उनके रेंडर पास के बाहर किसी दूसरे टारगेट से कभी सैंपल नहीं किया जाता. साथ ही, उन्हें मुख्य मेमोरी बैकिंग स्टोर के लिए बफ़र की ज़रूरत नहीं होती.

VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT को सही रेंडर टारगेट बनाते समय जोड़ा गया था. जैसे, मुख्य रंग और गहराई के टारगेट. ऐसा इसलिए किया गया, ताकि बफ़र मेमोरी को तब न दिया जाए, जब उसका कभी इस्तेमाल न किया जाए. सैंपल सीन में, लैज़ी ऐलोकेशन की वजह से मेमोरी में हुई बचत का अनुमान, रैम के 50 मेगाबाइट तक का है.

वीडियो को लगातार बफ़र करने की सुविधा

मोबाइल हार्डवेयर, मुख्य रैम और ग्राफ़िक रैम के बीच हार्डवेयर के अंतर के बजाय, यूनिफ़ाइड मेमोरी आर्किटेक्चर (यूएमए) का इस्तेमाल करता है. जब मुख्य रैम और ग्राफ़िक्स रैम अलग-अलग होती हैं, तो जीपीयू का इस्तेमाल करने के लिए, डेटा को मुख्य रैम से ग्राफ़िक्स रैम में ट्रांसफ़र करना ज़रूरी होता है. Godot, स्टैजिंग बफ़र का इस्तेमाल करके, अपने Vulkan रेंडरर में पहले से ही डेटा ट्रांसफ़र की प्रोसेस लागू करता है. UMA हार्डवेयर पर, कई तरह के डेटा के लिए स्टैजिंग बफ़र की ज़रूरत नहीं होती. सीपीयू और जीपीयू, दोनों मेमोरी का इस्तेमाल कर सकते हैं. Forge ने काम करने वाले हार्डवेयर पर, लगातार शेयर किए जाने वाले बफ़र के लिए सहायता लागू की है, ताकि जहां भी हो सके वहां स्टैजिंग को हटाया जा सके.

GoDot सीन की इमेज, जिसमें प्रोफ़ाइलिंग की जानकारी दिख रही है. इसमें, स्थायी बफ़र की सुविधा चालू और बंद होने की जानकारी दी गई है.
पहली इमेज. सैंपल सीन में, चालू और बंद किए गए पर्सिस्टेंट बफ़र के बीच के अंतर की प्रोफ़ाइलिंग.

एएसटीसी डिकोड मोड में बदलाव

मोबाइल हार्डवेयर पर, टेक्सचर को कंप्रेस करने के लिए, अडैप्टिव स्केलेबल टेक्सचर कंप्रेसन (एएसटीसी) का इस्तेमाल किया जाता है. डिकंप्रेस करने के दौरान, जीपीयू डिफ़ॉल्ट रूप से टेक्सल को ऐसी इंटरमीडिएट वैल्यू में डिकोड कर सकता है जो विज़ुअल फ़िडेलिटी के लिए ज़रूरी वैल्यू से ज़्यादा सटीक होती है. इस वजह से, टेक्सचर की परफ़ॉर्मेंस पर असर पड़ता है. अगर टारगेट हार्डवेयर पर VK_EXT_astc_decode_mode एक्सटेंशन काम करता है, तो डिकोड करते समय 16-बिट फ़्लोटिंग पॉइंट वैल्यू के बजाय, हर कॉम्पोनेंट के लिए 8-बिट की बिना नॉर्मलाइज़ की गई वैल्यू तय करने के लिए इसका इस्तेमाल किया जाता है.

स्क्रीन को पहले से घुमाना

Android पर Vulkan का इस्तेमाल करते समय बेहतर परफ़ॉर्मेंस के लिए, गेम को स्क्रीन के डिवाइस ओरिएंटेशन को रेंडर किए जाने वाले प्लैटफ़ॉर्म के ओरिएंटेशन के साथ अलाइन करना होगा. इस प्रोसेस को प्री-रोटेशन कहा जाता है. इमेज को पहले से घुमाने की प्रोसेस पूरी न करने पर, परफ़ॉर्मेंस में कमी आ सकती है. इसकी वजह यह है कि Android OS को इमेज को मैन्युअल तरीके से घुमाने के लिए, कंपोजिटर पास जोड़ना पड़ता है. Godot रेंडरर में, Android पर पहले से घुमाने की सुविधा जोड़ी गई है.

डीबग करने की सुविधा में सुधार

परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के साथ-साथ, The Forge ने Godot रेंडरर में ग्राफ़िक्स से जुड़ी समस्याओं को डीबग करने के अनुभव को बेहतर बनाया है. इसके लिए, इन सुविधाओं को जोड़ा गया है:

  • डिवाइस में गड़बड़ी होने पर, उसे ठीक करने में लगने वाले समय का एक्सटेंशन
  • ब्रेडक्रंब
  • डीबग मार्कर

डिवाइस में गड़बड़ी होने पर, उसे ठीक करने में लगने वाले समय का एक्सटेंशन

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

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

डीबग मार्कर

जब ड्राइवर इनका इस्तेमाल करता है, तब डीबग मार्कर का इस्तेमाल संसाधनों के नाम देने के लिए किया जाता है. इससे, उपयोगकर्ता के पढ़ने लायक स्ट्रिंग को रेंडर पास जैसे ऑपरेशन और बफ़र और टेक्सचर जैसे संसाधनों से जोड़ा जा सकता है. ऐसा, रेंडरडॉक जैसे ग्राफ़िक टूल का इस्तेमाल करते समय किया जा सकता है. Godot Vulkan रेंडरर में, डीबग मार्कर एनोटेशन की सुविधा जोड़ी गई.

Godot Engine ब्लॉग - Google और The Forge के साथ मिलकर काम करने के बारे में अपडेट

Godot Engine Vulkan के साथ मिलकर काम करने के लिए पुल का अनुरोध