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

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

glDrawElements कॉल के लिए फ़्रेम प्रोफ़ाइलिंग व्यू. इसमें ड्रॉ कॉल पैरामीटर के बारे में ज़्यादा जानकारी के लिए, कर्सर घुमाया गया है
पहली इमेज. एक glDrawElements कॉल के लिए फ़्रेम प्रोफ़ाइलिंग व्यू. इसमें 2,718 ट्राएंगल प्रिमिटिव दिखाए गए हैं

Vertex attribute compression

आपके गेम को एक आम समस्या का सामना करना पड़ सकता है. यह समस्या, औसत वर्टेक्स साइज़ का बड़ा होना है. ज़्यादा वर्टेक्स सबमिट करने और हर वर्टेक्स का साइज़ बड़ा होने पर, जीपीयू को वर्टेक्स मेमोरी से डेटा पढ़ने के लिए ज़्यादा बैंडविड्थ की ज़रूरत होती है.

किसी दिए गए ड्रॉ कॉल के लिए वर्टेक्स फ़ॉर्मैट देखने के लिए, यह तरीका अपनाएं:

  1. अपनी पसंद का कोई ड्रॉ कॉल चुनें.

    यह सीन के लिए सामान्य ड्रॉ कॉल, बड़ी संख्या में वर्टेक्स वाला ड्रॉ कॉल, जटिल कैरेक्टर मॉडल के लिए ड्रॉ कॉल या किसी अन्य तरह का ड्रॉ कॉल हो सकता है.

  2. पाइपलाइन पैनल पर जाएं. इसके बाद, इनपुट असेंबली के लिए IA पर क्लिक करें. इससे जीपीयू में आने वाले वर्टेक्स के वर्टेक्स फ़ॉर्मैट के बारे में पता चलता है.

  3. एट्रिब्यूट और उनके फ़ॉर्मैट की सीरीज़ देखें. उदाहरण के लिए, R32G32B32_SFLOAT एक 3-कॉम्पोनेंट वाला 32-बिट साइंड फ़्लोट है.

ड्रॉ कॉल के इनपुट असेंबली के लिए फ़्रेम प्रोफ़ाइलिंग व्यू. इसमें वर्टेक्स एट्रिब्यूट को कंप्रेस नहीं किया गया है
दूसरी इमेज. ड्रॉ कॉल के लिए इनपुट असेंबली. इसमें कंप्रेस नहीं किए गए एट्रिब्यूट हैं. इससे वर्टेक्स का साइज़ 56 बाइट हो जाता है

अक्सर, वर्टेक्स एट्रिब्यूट को कंप्रेस किया जा सकता है. इससे, मॉडल की क्वालिटी में बहुत कम गिरावट आती है. खास तौर पर, हमारा सुझाव है कि आप:

  • वर्टेक्स की पोज़िशन को हाफ़-प्रिसिशन वाले 16-बिट फ़्लोट में कंप्रेस किया जा रहा है
  • यूवी टेक्सचर कोऑर्डिनेट को 16-बिट के बिना हस्ताक्षर वाले पूर्णांकों में कंप्रेस करना
  • क्वाटर्नियन का इस्तेमाल करके, सामान्य, स्पर्शरेखा, और द्विलंबवत वेक्टर को एन्कोड करके, स्पर्शरेखा स्पेस को कंप्रेस करना

अन्य एट्रिब्यूट को भी, हर मामले के हिसाब से कम सटीक टाइप के लिए इस्तेमाल किया जा सकता है.

वर्टेक्स स्ट्रीम स्प्लिटिंग

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

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

यह पता लगाने के लिए कि वर्टेक्स एट्रिब्यूट को सही तरीके से बांटा गया है या नहीं:

  1. अपनी पसंद का ड्रॉ कॉल चुनें और ड्रॉ कॉल नंबर नोट करें.

    यह सीन के लिए सामान्य ड्रॉ कॉल, बड़ी संख्या में वर्टेक्स वाला ड्रॉ कॉल, जटिल कैरेक्टर मॉडल के लिए ड्रॉ कॉल या किसी अन्य तरह का ड्रॉ कॉल हो सकता है.

  2. पाइपलाइन पैनल पर जाएं. इसके बाद, इनपुट असेंबली के लिए IA पर क्लिक करें. इससे, जीपीयू में आने वाले वर्टेक्स के लिए वर्टेक्स फ़ॉर्मैट तय होता है.

  3. अपने वर्टेक्स एट्रिब्यूट की बाइंडिंग देखें. आम तौर पर, ये लीनियर तरीके से बढ़ सकती हैं (0, 1, 2, 3 वगैरह), लेकिन ऐसा हमेशा नहीं होता. वर्टेक्स पोज़िशन आम तौर पर, वर्टेक्स एट्रिब्यूट की सूची में सबसे पहले होती है.

  4. स्टेट पैनल में, LastDrawInfos ढूंढें और मैच करने वाले ड्रॉ कॉल नंबर को बड़ा करें. इसके बाद, इस ड्रॉ कॉल के लिए BoundVertexBuffers को बड़ा करें.

  5. दिए गए ड्रॉ कॉल के दौरान, बाउंड किए गए वर्टेक्स बफ़र देखें. इनके इंडेक्स, पहले के वर्टेक्स एट्रिब्यूट बाइंडिंग से मेल खाते हैं.

  6. अपने ड्रॉ कॉल के वर्टेक्स एट्रिब्यूट के लिए बाइंडिंग को बड़ा करें और बफ़र को बड़ा करें.

  7. बफ़र के लिए VulkanHandle देखें. ये बफ़र, उस मेमोरी को दिखाते हैं जहां से वर्टेक्स डेटा सोर्स होता है. अगर VulkanHandle अलग-अलग हैं, तो इसका मतलब है कि एट्रिब्यूट अलग-अलग बफ़र से मिले हैं. अगर VulkanHandle एक जैसे हैं, लेकिन ऑफ़सेट बड़े हैं (उदाहरण के लिए, 100 से ज़्यादा), तो एट्रिब्यूट अब भी अलग-अलग सब-बफ़र से मिल सकते हैं. हालांकि, इसके लिए आगे की जांच ज़रूरी है.

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

वर्टेक्स स्ट्रीम स्प्लिटिंग और अलग-अलग गेम इंजन पर इसे ठीक करने के तरीके के बारे में ज़्यादा जानकारी के लिए, इस विषय पर हमारी ब्लॉग पोस्ट देखें.