2011-12-14 9 views
19

मैं this लेख पढ़ रहा था, और लेखक लिखते हैं:ओपनजीएल में प्रोग्राम प्रदर्शन के लिए खराब है?

यहाँ कैसे दो आसान चरणों में हर मंच पर उच्च प्रदर्शन अनुप्रयोगों लिखने के लिए है:
[...]
सर्वोत्तम प्रथाओं का पालन करें। एंड्रॉइड और ओपनजीएल के मामले में, इसमें "बैच ड्रॉ कॉल" जैसी चीजें शामिल हैं, "खंडों के टुकड़ों में त्यागें का उपयोग न करें", और इसी तरह।

मैंने कभी यह नहीं सुना है कि निष्कासन पर प्रदर्शन पर बुरा असर होगा या ऐसा, और विस्तृत अल्फा आवश्यक होने पर मिश्रण से बचने के लिए इसका उपयोग कर रहा है।

क्या कोई यह बता सकता है कि क्यों और कब छोड़ने का उपयोग खराब अभ्यास माना जा सकता है, और अल्फा + मिश्रण के साथ + गहराई से तुलना कैसे की जाती है?

संपादित करें: इस प्रश्न पर उत्तर प्राप्त करने के बाद मैंने पृष्ठभूमि के ढाल को पृष्ठभूमि के ढाल के साथ कुछ परीक्षण किया।

  • GL_DEPTH_TEST और एक टुकड़ा-शेडर लाइन "if( gl_FragColor.a < 0.5){ discard; }" के साथ समाप्त होने का उपयोग दे दी है के बारे में 32 एफपीएस
  • खंड-शेडर से if/discard कथन को हटाकर 44 fps पर प्रतिपादन गति में वृद्धि हुई।
  • मिश्रण समारोह के साथ GL_BLEND का प्रयोग "(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)" GL_DEPTH_TEST के बजाय भी चारों ओर 44 एफपीएस हुई।
+0

बहुत ही रोचक सवाल है, मुझे उम्मीद है कि कोई इसका जवाब दे पाएगा। – bvd

उत्तर

16

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

ध्यान दें कि आपको अल्फा परीक्षण चालू करने से एक ही समस्या मिल जाएगी।

+1

आह, मैं देखता हूं। तो अगर त्याग का उपयोग किया जाता है, तो क्या यह हर टाइल को प्रभावित करेगा, या सिर्फ एक जिसमें एक टुकड़ा त्याग दिया जाएगा? अगर यह केवल एक टाइल को प्रभावित करता है, तो यह अल्फा/मिश्रण का उपयोग करने से भी अधिक कुशल होना चाहिए, सही? – Jave

+1

"अल्फा/ब्लेंडिंग" से आपका क्या मतलब है? किसी भी मामले में, यह प्रत्येक टाइल को प्रभावित करेगा जो एक विखंडन शेडर निष्पादित करता है जो 'त्याग' कीवर्ड का उपयोग करता है, चाहे वह वास्तव में इसे कॉल करता है या नहीं। –

+0

अल्फा/ब्लेंडिंग के साथ मैं बस वर्तमान खंड की दृश्यता निर्धारित करने वाले अल्फामैप के साथ एक बनावट का उपयोग कर रहा हूं। अगर मुझे सही तरीके से याद है जो ठीक से काम नहीं करता है जब तक कि आपके पास GL_BLEND सक्षम नहीं है और GL_DEPTH_TEST नहीं है (यदि आप किसी ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट के सामने प्रस्तुत करते हैं)? – Jave

17

"मुख्य" प्रत्येक मुख्यधारा के ग्राफिक्स त्वरण तकनीक - आईएमआर, टीबीआर, टीबीडीआर के लिए "त्यागना" खराब है। इसका कारण यह है कि एक टुकड़े (और इसलिए गहराई) की दृश्यता केवल खंडन प्रसंस्करण के बाद निर्धारित होती है, न कि प्रारंभिक-जेड या पावरवीआर के एचएसआर (छुपा सतह हटाने) आदि के दौरान। ग्राफिक्स पाइपलाइन को आगे छोड़ने से पहले कुछ हटाने पर इसका प्रभाव पड़ता है प्रदर्शन; इस मामले में टुकड़ों की अधिक प्रसंस्करण + अन्य बहुभुजों की गहराई प्रसंस्करण में व्यवधान = खराब प्रभाव

यदि आपको अव्यवस्था का उपयोग करना चाहिए तो सुनिश्चित करें कि केवल उस ट्राइस को चाहिए जिसमें इसे शामिल करने वाले शेडर के साथ प्रस्तुत किया गया हो और इसके प्रभाव को कम करने के लिए समग्र प्रतिपादन प्रदर्शन, क्रम में अपनी वस्तुओं को प्रस्तुत करें: अपारदर्शी, त्याग, मिश्रित।

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

+0

"एक टुकड़े की दृश्यता (और इसलिए गहराई) केवल खंडन प्रसंस्करण के बाद निर्धारित है और प्रारंभिक-जेड या पावरवीआर के एचएसआर (छुपा सतह हटाने) आदि के दौरान नहीं। यह पूरी तरह से सच नहीं है। या तो प्रारंभिक-जेड या त्याग एक टुकड़े को खींचना से रोक सकता है। तो एक और फिर दूसरा करना बहुत संभव है। PowerVR आपके द्वारा बताए गए कारणों के लिए नहीं कर सकता है। लेकिन पारंपरिक प्रस्तुतकर्ता निश्चित रूप से कर सकते हैं। यदि वे नहीं करते हैं, तो यह केवल इसलिए होगा क्योंकि डिस्कवरिंग तर्क गहराई परीक्षण तर्क के साथ बंडल किया जाता है। यह एक हार्डवेयर डिजाइन मुद्दा है, एक एल्गोरिदमिक आवश्यकता नहीं है। –

+0

मैं उस मामले को याद करता हूं जहां मौजूदा निकाय के पीछे एक त्याग खंड 'पीछे' दिया जाता है: एस - क्या आपका मतलब है? प्रारंभिक ज़ेड और एचएसआर दोनों ही स्थिति में खंड प्रसंस्करण के बिना टुकड़े को अस्वीकार कर देंगे। फिर भी, प्रारंभिक-जेड को अस्पष्ट, त्याग करने वाले लोगों के सामने अस्पष्ट टुकड़े प्रस्तुत किए जाने की आवश्यकता होती है या त्याग करने वाले शेडर को गहराई निर्धारित करने के लिए अभी भी उन टुकड़ों के लिए चलाने की आवश्यकता होती है। एचएसआर इस मामले में सबमिशन ऑर्डर पर निर्भर नहीं है - फ्रेम के अंत में, अगर टुकड़े टुकड़े को अपारदर्शी टुकड़ों के पीछे छोड़ दिया जाता है तो उन्हें पावरवीआर द्वारा संसाधित नहीं किया जाता है। – gmaclachlan

+0

कई कारणों से एक टुकड़ा प्रस्तुत करने में असफल हो सकता है। गहराई परीक्षण एक है, त्याग एक और है। प्रारंभिक-जेड पहले गहराई परीक्षण करता है। एकमात्र कारण त्याग इस में हस्तक्षेप करेगा अगर डिस्कार्ड तर्क हार्डवेयर में गहराई परीक्षण तर्क में बंधे थे। सिर्फ इसलिए कि कुछ गहराई परीक्षण पास करता है इसका मतलब यह नहीं है कि यह सब कुछ पारित करेगा। यदि गहराई और त्याग जोड़ रहे हैं, तो यह केवल इसलिए है क्योंकि हार्डवेयर इस तरह से बनाया गया है, क्योंकि यह * एल्गोरिदम द्वारा * ऐसा नहीं किया गया है। आप अर्ली-जेड परीक्षण करने में सक्षम होना चाहिए और फिर भी बाद में त्यागना चाहिए। –

1

ऑब्जेक्ट ए ऑब्जेक्ट बी के सामने है ऑब्जेक्ट ए में 'डिसकार्ड' का उपयोग करके एक शेडर है। इस प्रकार, मैं 'अर्ली-जेड' ठीक से नहीं कर सकता क्योंकि मुझे पता होना चाहिए कि ऑब्जेक्ट बी के कौन से अनुभाग ऑब्जेक्ट ए के माध्यम से दिखाई देंगे। इसका मतलब है कि ऑब्जेक्ट ए को प्रसंस्करण पाइपलाइन के माध्यम से लगभग आखिरी तक पास करना होगा पल (जब तक कि प्रजनन प्रसंस्करण नहीं किया जाता है) इससे पहले कि मैं यह निर्धारित कर सकूं कि ऑब्जेक्ट बी वास्तव में दिखाई दे रहा है या नहीं।

यह एचएसआर और 'अर्ली-जेड' के लिए बुरा है क्योंकि संभावित रूप से प्रक्षेपित वस्तुओं को बैठना है और प्रक्रियाओं से पहले गहराई से जानकारी अपडेट होने की प्रतीक्षा करनी है। जैसा कि ऊपर बताया गया है, हर किसी के लिए यह बुरा है, या, थोड़ा और दोस्ताना तरीका है "दोस्तों को छोड़ने का उपयोग न करें"।

2

इसके अलावा, आपके टुकड़े के शेडर में "if" कथन होने से कुछ हार्डवेयर पर बड़ी मंदी हो सकती है। (विशेष रूप से, जीपीयू जो अत्यधिक पाइपलाइन होते हैं, या जो एकल निर्देश/एकाधिक डेटा करते हैं, उनके पास शाखा विवरणों से बड़े प्रदर्शन दंड होंगे।) इसलिए आपके परीक्षण परिणाम "अगर" कथन और अन्य लोगों द्वारा किए गए प्रभावों का संयोजन हो सकते हैं।

(इसके लिए क्या है इसके लिए, मेरे गैलेक्सी नेक्सस पर परीक्षण ने एक बड़ी गति दिखायी जब मैंने अपनी semitransparent वस्तुओं को गहराई से क्रमबद्ध करने और यादृच्छिक क्रम में प्रतिपादन और शेडर में टुकड़े को हटाने के बजाय उन्हें आगे बढ़ाना शुरू किया।)