2014-10-03 7 views
6

मान लें कि मेरे पास 5 इकाइयां (ऑब्जेक्ट्स) एक विधि Render() है। प्रतिपादन के लिए प्रत्येक इकाई को बफर में अपना खुद का शिखर सेट करने की आवश्यकता होती है।एक बड़ा ओपनजीएल वर्टेक्स बफर, या कई छोटे?

निम्नलिखित में से कौन सा विकल्प बेहतर है?

  1. उपयोग एक बड़ा पूर्व आवंटित glGenBuffer के साथ बनाया बफर, जो हर इकाई glBufferSubData साथ बफर करने के लिए अपने कोने लिख कर (बफर Render तरीकों के तर्क के रूप में पारित कर दिया की आईडी) का उपयोग करेगा।
  2. प्रत्येक इकाई अपने स्वयं के बफर का निर्माण और उपयोग करती है।

यदि एक बड़ा बफर बेहतर होता है, तो मैं उचित शेडर्स और सबकुछ के साथ इस बफर (सभी इकाइयों से) में सभी शीर्षकों को कैसे ठीक से प्रस्तुत कर सकता हूं?

उत्तर

1

आपके पास प्रत्येक इकाई के लिए glGenBuffer के साथ एक वीबीओ (वेरटेक्स बफर ऑब्जेक्ट) का उपयोग करना आसान है लेकिन यह हमेशा करने के लिए सबसे अच्छी चीजें नहीं है, यह उपयोग पर निर्भर करता है। लेकिन, ज्यादातर मामलों में, प्रत्येक इकाई के लिए 1 वीबीओ होने की कोई समस्या नहीं है और प्रतिपादन शायद ही कभी प्रभावित होता है।

अच्छा जानकारी पर स्थित है: OpenGL Vertex Specification Best Practices

8

कई VBOs होने जब तक कि वे एक निश्चित आकार है के रूप में ठीक है। आप जो बचाना चाहते हैं वह बहुत कम ड्रॉ कॉल करना है, और अलग-अलग बफर को बार-बार बांधना है।

अत्यधिक ओवरहेड से बचने के लिए बफर को कितने बड़े होने चाहिए, इतने सारे कारकों पर निर्भर करता है कि अंगूठे का नियम भी देना असंभव है। खेल में आने वाले कारकों में शामिल हैं:

  • हार्डवेयर प्रदर्शन विशेषताओं।
  • चालक दक्षता।
  • टुकड़ों की संख्या (त्रिभुज आकार) से संबंधित शीर्षकों की संख्या।
  • शेडर्स की जटिलता।

आम तौर पर यह समान/संबंधित वस्तुओं को रखने के लिए समझ में आता है जिसे आप आम तौर पर एक ही कशेरुक बफर में एक ही समय में आकर्षित करते हैं।

एक ही बफर में सबकुछ रखना चरम लगता है, और वास्तव में प्रतिकूल प्रभाव हो सकता है। मान लें कि आपके पास एक बड़ी "दुनिया" है, जहां आप किसी दिए गए फ्रेम में केवल एक छोटा सबसेट प्रस्तुत करते हैं। यदि आप चरम पर जाते हैं, तो एक विशाल बफर में सभी कोष्ठक होते हैं, कि प्रत्येक ड्रॉ कॉल के लिए बफर को GPU के लिए पहुंच योग्य होने की आवश्यकता होती है। वास्तुकला के आधार पर, और कैसे बफर आवंटित किया जाता है, इसका मतलब यह हो सकता है:

  • समर्पित GPU स्मृति (जैसे VRAM) में बफर है, जो अगर यह बहुत बड़ा है समस्याग्रस्त किया जा सकता रखने के लिए प्रयास कर रहा है।
  • GPU पता स्थान में स्मृति को मैप करना।
  • स्मृति पिनिंग/तारों।

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

यदि कॉलिंग के साथ प्रतिपादन किया जाता है जो तर्कों द्वारा दिए गए बफर के उप-समूह तक पहुंच सकता है, जैसे glDrawArrays() या glDrawRangeElements(), ड्राइवर के लिए पूरे बफर GPU को सुलभ बनाने से बचना संभव हो सकता है। लेकिन मैं उस घटना पर जरूरी नहीं होगा।

+0

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

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