2011-09-24 18 views
17

क्या preferrable है, देखने का एक effiency बिंदु (या देखने की एक अन्य बिंदु है, तो यह महत्वपूर्ण है) से है करने के लिए है?ओपन यह बैच के लिए बेहतर आकर्षित या स्थिर VBOs

स्थिति
एक ओपन अनुप्रयोग है कि विभिन्न स्थानों पर कई लाइनों ड्रॉ हर फ्रेम (60 एफपीएस)। आइए कहें कि 10 लाइनें हैं। या 100 000 लाइनें। क्या जवाब अलग होगा?

  • # 1 एक लाइन

हर फ्रेम के लिए होता है एक glDrawArrays प्रति पंक्ति आकर्षित करने के लिए फोन के 2 कोने से युक्त एक स्थिर VBO कि कभी नहीं बदलता है, और उनके बीच की मैट्रिक्स परिवर्तनों होगा हमारे एक पंक्ति स्थिति

  • # 2 अद्यतन VBO सभी लाइनों के लिए डेटा के साथ हर फ्रेम

हर फ्रेम एक भी ड्रा कॉल

उत्तर

27

दूसरा अविश्वसनीय रूप से और अधिक कुशल है होगा।

बदलने राज्यों, विशेष रूप से परिवर्तन और मैट्रिक्स, अन्य राज्यों की पुनर्गणना और आम तौर पर अधिक गणित का कारण बन जाता है।

अद्यतन कर रहा है ज्यामिति, तथापि, बस एक बफर अधिलेखन शामिल है।

बल्कि बड़े पैमाने पर बैंडविड्थ बसों पर आधुनिक वीडियो हार्डवेयर के साथ

, भर में कुछ तैरता भेजने तुच्छ है। उन्हें बहुत से डेटा को तेज़ी से स्थानांतरित करने के लिए डिज़ाइन किया गया है, यह नौकरी का दुष्प्रभाव है। वर्टेक्स बफर को अपडेट करना वही है जो वे अक्सर और तेज़ करते हैं। यदि हम प्रत्येक 32 बाइट्स (फ्लोट 4 स्थिति और रंग) के अंक मानते हैं, तो 100000 लाइन सेगमेंट 6 एमबी से कम है और पीसीआईई 2.0 x16 लगभग 8 जीबी/एस है, मुझे विश्वास है।

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

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

एक बहुत स्पष्ट उदाहरण के रूप में, # 1 के लिए सबसे अच्छा मामला मानें: ट्रांसफॉर्म सेट ट्रिगर्स को कोई अतिरिक्त गणना नहीं होती है और ड्राइवर बफर उत्साहपूर्वक और पूरी तरह से।100000 लाइनों आकर्षित करने के लिए, आप की जरूरत:

  • 100000 मैट्रिक्स सेट (प्रणाली रैम में) समारोह कॉल उपरि साथ
  • 100000 मैट्रिक्स सेट कॉल (वीडियो ड्राइवर के लिए, वहाँ बफर करने के लिए मैट्रिक्स को कॉपी)
  • 100000 मैट्रिक्स वीडियो रैम को कॉपी किया है, एक भी गांठ में प्रदर्शन
  • 100000 लाइन ड्रा कॉल

समारोह कॉल उपरि अकेले जा रहा है प्रदर्शन मार डालते हैं।

दूसरी ओर, बैचिंग शामिल है:

  • 100000 बिंदु गणना और सेट, प्रणाली रैम में
  • 1 vbo प्रतिलिपि वीडियो रैम है। यह एक बड़ा हिस्सा होगा, लेकिन एक ही संकीर्ण हिस्सा और दोनों पक्षों को पता है कि क्या उम्मीद करनी है। इसे अच्छी तरह से संभाला जा सकता है।
  • 1 मैट्रिक्स सेट कॉल
  • 1 मैट्रिक्स प्रतिलिपि वीडियो रैम को
  • 1 ड्रा कॉल

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

1:

for (i = 0; i < 100000; ++i) 
{ 
    matrix = calcMatrix(i); 
    setMatrix(matrix); 
    drawLines(1, vbo); 
} 

(अब खोलने कि)

2:

matrix = calcMatrix(); 
setMatrix(matrix); 
for (i = 0; i < 100000; ++i) 
{ 
    localVBO[i] = point[i]; 
} 
setVBO(localVBO); 
drawLines(100000, vbo); 
+3

ठीक है, तो मतलब है कि यह है कि यह वास्तव में स्पष्ट है, इसके लिए सरल कोड कल्पना करने के लिए एक वीबीओ में सेंकना हमेशा बेहतर होता है और फिर मैट्रिस का उपयोग करने के विरोध में ड्रॉ करता है? क्या होगा यदि मैंने एक मुट्ठी भर, शायद 10, चलती बनावट quads कहा है। क्या ऑब्जेक्ट्स के निर्देशांक की गणना करना, वीबीओ को फिर से बनाना, अपलोड करना और ड्रा करना वाकई बेहतर होगा? प्रत्येक ऑब्जेक्ट पर मैट्रिक्स अनुवाद का उपयोग करने के विरोध में (जिसे मैं 64 गुणाओं और 48 परिवर्धनों के बजाय बस 2 जोड़ों के अनुकूल बनाता हूं) और उसके बाद प्रत्येक के लिए चित्रण करता हूं। – mk12

+1

"अगर हम प्रत्येक 32 बाइट्स (फ्लोट 4 स्थिति और रंग) के अंक मानते हैं" और यह आधे में कटौती करने के लिए लगभग कोई प्रयास नहीं करेगा: स्थिति के vec3 और बिना हस्ताक्षरित बाइट रंगों का vec4। इसके अलावा, आपको इसके प्रदर्शन को बेहतर बनाने के लिए [बफर ऑब्जेक्ट स्ट्रीमिंग] (http://www.opengl.org/wiki/Buffer_Object_Streaming) की जांच करनी चाहिए। –

+1

@ एमके 12 आपने एक और अधिक जटिल सवाल पूछा है। आपके प्रश्न का उत्तर सरल था क्योंकि प्रत्येक वस्तु बहुत छोटी थी और यहां तक ​​कि जब आप उनमें से बहुत से थे, तो कशेरुक डेटा छोटा था। एक बार आपके पास बड़ी संख्या में ऑब्जेक्ट्स हो जाने के बाद, अपलोड की लागत के रूप में, उनकी स्थिति की गणना करने की लागत अधिक महत्वपूर्ण हो जाती है। –

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

  • कोई संबंधित समस्या नहीं^_^