2011-12-28 25 views
9

तो मैं समझता हूं कि वर्टेक्स बफर ऑब्जेक्ट का उपयोग कैसे करें, और यह तत्काल मोड ड्राइंग पर एक बड़ा प्रदर्शन वृद्धि प्रदान करता है। मैं बहुत सारे 2 डी क्वाड (स्प्राइट्स) खींचेगा, और मैं जानना चाहता हूं कि क्या मुझे प्रत्येक के लिए एक वीबीओ बनाना है, या सभी डेटा रखने के लिए एक वीबीओ बनाना है?मैं कितने वीबीओ उपयोग करता हूं?

उत्तर

17

आपको प्रत्येक स्प्राइट/ट्रैक्टर के लिए एक नया वीबीओ उपयोग नहीं करना चाहिए। तो उन्हें एक ही वीबीओ में डालने से आपके मामले में बेहतर समाधान होगा।

लेकिन आम तौर पर मुझे नहीं लगता कि इसका उत्तर एक वाक्य में दिया जा सकता है।

प्रत्येक Quad के लिए एक नया VBO बनाने से आपको एक वास्तविक प्रदर्शन वृद्धि नहीं देंगे। यदि आप ऐसा करते हैं, तो वीबीओ स्विच करने के लिए glBindBuffer कॉल के साथ बहुत समय बर्बाद हो जाएगा। हालांकि यदि आप वीबीओ बनाते हैं जिसमें बहुत अधिक डेटा है तो आप अन्य समस्याओं में भाग सकते हैं।

छोटे VBOs:

  • अक्सर अपने कार्यक्रम कोड में संभाल करने के लिए आसान कर रहे हैं। आप प्रस्तुत करने वाले प्रत्येक ऑब्जेक्ट के लिए एक नया VBO का उपयोग कर सकते हैं। इस तरह आप अपनी दुनिया को अपनी दुनिया में बहुत आसान बना सकते हैं
  • यदि वीबीओ बहुत छोटे हैं (केवल कुछ त्रिकोण) तो आपको अधिक लाभ नहीं मिलता है। समय का एक बहुत बफ़र्स के बीच बफर स्विचिंग (और शायद स्विचिंग shaders/बनावट)

बड़े VBOs साथ खो जाएगा:

  • आप सर्वश्रेष्ठ प्रदर्शन के लिए एक एकल drawArrays() कॉल के साथ वस्तुओं की टन प्रदान कर सकते हैं।
  • अपने डेटा के आधार पर यह संभव है कि आप एक ही VBO में वस्तुओं का एक बहुत कुछ के प्रबंधन के लिए भूमि के ऊपर बनाने (क्या हुआ अगर आप इन वस्तुओं में से एक को स्थानांतरित करने और किसी अन्य वस्तु बारी बारी से करना चाहते हैं?)।
  • अपने VBOs बहुत बड़ी यह संभव है कि वे VRAM में ले जाया जा सकता है, तो

निम्न लिंक आप मदद कर सकते हैं:

Vertex Specification Best Practices

1

एक का उपयोग करें (या की एक छोटी संख्या) VBO (रों) सभी धारण करने के लिए/अपने ज्यामिति के सबसे।

आम तौर पर कम एपीआई बेहतर, अपने दृश्य प्रस्तुत करना लेता है कहता है।

1

यह भी निर्भर करता है कि आप क्या करना चाहते हैं d उन sprites के साथ करते हैं?

क्या वे गतिशील हैं? क्या आप केवल क्वाड का केंद्र बदलना चाहते हैं या शायद सभी चार बिंदुओं को संशोधित करना चाहते हैं?

यह महत्वपूर्ण है अपने डेटा तो गतिशील हैं, सबसे आसान तरीका में, आप प्रत्येक फ्रेम GPU के लिए CPU से स्थानांतरित करना होगा क्योंकि। शायद आप GPU पर सभी गणना कर सकते हैं - उदाहरण के लिए ज्यामिति शेडर्स का उपयोग करके?

इसके अलावा बहुत ही सरल quads/स्प्राइट के लिए एक GL_POINT_SPRITE उपयोग कर सकते हैं। इसके साथ ही पूरे क्वाड के लिए केवल एक कशेरुक भेजने की आवश्यकता है। लेकिन दोष यह है कि इसे घुमाने में मुश्किल है ...

संबंधित मुद्दे