प्रत्येक ग्लैड्र * एक ड्रॉ कॉल है।
1 glDrawArrays 1 ड्रॉ कॉल है।
1 glDrawElements 1 ड्रॉ कॉल है।
इससे कोई फर्क नहीं पड़ता (अब तक ड्रॉ कॉल काउंट का संबंध है) आप कितने वर्टिकल या इंडेक्स का उपयोग करते हैं, 1 ग्लड्रॉव * 1 ड्रॉ कॉल है।
क्वैड ड्रॉ करने के सरल मामले (जीएल संस्करण जिसे आप उपयोग करते हैं, हटाए गए क्वैड नहीं हैं) या त्रिकोण इनकी तुलना करने के लिए एक अच्छा उदाहरण नहीं हैं, क्योंकि क्वैड की सूची या त्रिकोणों की सूची को सिंगल कॉल के साथ या तो आरेखित किया जा सकता है। और glDrawArrays अधिक कुशल दिखाई देगा क्योंकि इसमें अनुक्रमण का अतिरिक्त ओवरहेड नहीं है।
आइए थोड़ा और अधिक जटिल मामला लें, लेकिन एक जो अधिक वास्तविक दुनिया के परिदृश्य का प्रतिनिधि है। कल्पना करें कि आपके पास कई त्रिभुज स्ट्रिप्स और प्रशंसकों से बना एक मॉडल है:
glDrawArrays (GL_TRIANGLE_FAN, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_FAN, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_FAN, .....);
इस उदाहरण में, glDrawArrays का उपयोग करने से आपको मॉडल के लिए कुल 6 ड्रॉ कॉल मिलते हैं। हालांकि, दोनों स्ट्रिप्स और प्रशंसकों को आसानी से अनुक्रमित त्रिकोण में परिवर्तित किया जा सकता है, इसलिए सूचकांक जोड़ें और यह हो जाता है:
glDrawElements (GL_TRIANGLES, .....);
वह पूरे मॉडल के लिए एक ड्रॉ कॉल है।
GlDrawArrays पर glDrawElements के फायदे सिर्फ मेमोरी सेविंग से ज्यादा हैं, जो इसे मापने का भोला तरीका है। नहीं है संभावित क्योंकि एक सूचकांक आम तौर पर एक शिखर (ताकि भले ही आप संतुलन पर सूचकांक के बहुत सारे है वे छोटे हो जाएगा) से छोटी है, स्मृति की बचत जहां कोने पुन: उपयोग किया जा सकता है के लिए है, लेकिन अन्य लाभ शामिल हैं:
कम की गई कॉल की गिनती। प्रत्येक आह्वान में कुछ ओवरहेड को राज्य से मान्य करने, चीजों को स्थापित करने, आदि के बारे में बताया जाता है, और इस ओवरहेड का अधिकांश भाग सीपीयू की तरफ होता है। ड्रॉ कॉल की संख्या को कम करके हम इस ओवरहेड से बहुत अधिक बचते हैं।
वर्टेक्स का पुन: उपयोग। यह सिर्फ मेमोरी सेविंग से बहुत अधिक है। आपके जीपीयू की संभावना एक हार्डवेयर वर्टेक्स कैश है, जहां हाल ही में परिवर्तित कोने संग्रहीत किए जा सकते हैं; यदि वही वर्टेक्स फिर से आता है, और यदि यह कैश में है, तो इसे फिर से बदलने के बजाय कैश से पुन: उपयोग किया जा सकता है। आपका हार्डवेयर सूचकांकों की तुलना करके कैश की जांच करेगा, इसलिए ओपनजीएल शब्दों में आपको कैश का उपयोग करने का एकमात्र तरीका है GladrawElements का उपयोग करना।
तो अपने विशिष्ट सवालों के जवाब देने के लिए:
कैसे glDrawElements ड्रा कॉल को बचा सकता है ...? आपके द्वारा उपयोग किए जाने वाले उदाहरण में, यह नहीं है। प्रत्येक में एक ड्रॉ कॉल है। जैसा कि मैं ऊपर चर्चा करता हूं, यह उदाहरण दोनों की तुलना करने के लिए बहुत बुरा है।
GlDrawElements का उपयोग करके अंतरिक्ष को कैसे बचाया जाएगा ...? क्योंकि सूचकांक लंबों की तुलना में छोटे होते हैं। एक 16-बिट इंडेक्स दो बाइट्स है, एक स्थिति / रंग / टेक्सकोर्ड शीर्ष 24 बाइट्स है। 6 कोने 144 बाइट्स हैं, 4 कोने प्लस 6 सूचकांक 108 बाइट्स हैं।
2 त्रिकोणों से एक वर्ग खींचने के मामले में ...? एक और एक। एक glDraw * कॉल वन ड्रॉ कॉल है, इस माप के लिए उपयोग किए जाने वाले वर्टिस या सूचकांकों की संख्या अप्रासंगिक है। लेकिन मुझे फिर से जोर देना चाहिए, दोनों की तुलना करने के लिए यह बहुत बुरा उदाहरण है।
अंत में, और बस मामलों को थोड़ा जटिल करने के लिए, जबकि त्रिकोण के साथ glDrawElements डेस्कटॉप जीपीयू पर इष्टतम पथ है, मोबाइल पर यह बहुत अलग हो सकता है। कुछ मोबाइल GPU GL_TRIANGLE_STRIP के साथ glDrawArrays पसंद कर सकते हैं (आप इस मामले में आदिमों को छिपाने के लिए पतले त्रिकोण जोड़ सकते हैं), और मैंने आदिम पुनरारंभ या बहु-ड्रा जैसे अधिक उन्नत विषयों पर भी नहीं छुआ है।