मैं अपने शीर्ष और टुकड़े शेड की गति को अलग-अलग कैसे प्रोफाइल कर सकता हूं?


11

मैं जानना चाहता हूं कि मैं कैसे देख सकता हूं कि मेरे रेंडर पाइपलाइन में या तो मेरा शीर्ष या मेरा टुकड़ा shader एक अड़चन है।

मैंने ओपनग्ल कमांड के बीच घड़ी चौकियों को प्राप्त करने glQueryCounterके GL_TIMESTAMPलक्ष्य के साथ उपयोग करने के बारे में पढ़ा है , लेकिन ये विभिन्न प्रकार के शेड्स के बीच अंतर नहीं करते हैं।

उदाहरण के लिए, यदि GPU पर एक फ्रेम रेंडर करने के लिए 8 ms लेता है, तो क्या मैं बता सकता हूं कि वर्टेक्स शेडर ने 7 एमएस लिया और टुकड़ा शेडर ने 1 एमएस लिया?

जवाबों:


12

वर्टेक्स और फ्रैगमेंट शेड्स क्रमिक रूप से चलते हैं, क्रमिक रूप से नहीं, और GPU स्वचालित रूप से उनके बीच लोड-बैलेंस करता है, इसलिए एक के लिए 7 एमएस और दूसरे के लिए 1 एमएस जैसे विशिष्ट समय को सार्थक रूप से निर्दिष्ट करना संभव नहीं है।

हालाँकि, आप यह निर्धारित करने के लिए एक सरल प्रयोग कर सकते हैं कि अड़चन कहाँ है: अपने सभी ड्रॉ कॉल्स के लिए व्यू-प्रोजेक्शन मैट्रिक्स को सभी शून्य पर सेट करें। यह उनके पदों के लिए सभी कोने आउटपुट को शून्य बनाता है और सभी त्रिकोणों को पतित बनाता है; इसलिए यह शॉर्ट-सर्किट सभी रैस्टराइज़ेशन और फ़्रेग्मेंट शेडिंग करता है, जबकि सभी वर्टेक्स शेडर वर्क को रखते हुए (शेडर कंपाइलर कुछ भी ऑप्टिमाइज़ नहीं कर सकता है, क्योंकि यह नहीं जानता कि मैट्रिक्स रनटाइम पर शून्य पर सेट होगा)।

जब आप शून्य से मैट्रिसेस के साथ प्रदर्शन को मापते हैं, तो आपको GPU में किसी भी समवर्ती rasterization या टुकड़ा छायांकन कार्य के बिना, केवल शीर्ष शेड को चलाने के लिए आवश्यक समय की मात्रा दिखाई देगी। फिर आप प्रत्येक पास के लिए साधारण रेंडरिंग के लिए आवश्यक समय की तुलना कर सकते हैं। यदि दो बार समान हैं, तो पास संभवतः अत्यधिक शीर्ष-बाध्य है; यदि शून्य-मैट्रिक्स प्रतिपादन काफी तेज है, तो यह शायद पिक्सेल-बाउंड है। एक मध्यवर्ती परिणाम प्राप्त करना भी संभव है, यह दर्शाता है कि कार्य दोनों के बीच समान रूप से विभाजित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.