2010-11-03 11 views
14

मेरे पास कई कण हैं जो हर फ्रेम को बदलते हैं। वर्तमान में 'क्लाइंट' मेमोरी में वर्टेक्स सरणी का उपयोग करके शीर्षकों को खींचा जा रहा है। यदि मैं वर्टेक्स बफर ऑब्जेक्ट का उपयोग करता हूं तो मैं किस प्रदर्शन विशेषताओं की अपेक्षा कर सकता हूं?बहुत गतिशील डेटा के लिए वर्टेक्स बफर ऑब्जेक्ट का उपयोग करना एक अच्छा विचार प्रदर्शन-वार है?

चूंकि मुझे कण कोष्ठक को अद्यतन करने के लिए कई ग्लबफर्सबडाटा का उपयोग करना है, इसलिए मैं हर फ्रेम को वीडियो मेमोरी में वर्टिस को स्थानांतरित कर रहा हूं (जैसे मैं नियमित वर्टेक्स सरणी का उपयोग करता हूं)? क्या इस मामले में वीबीओ के लिए कोई फायदा है?

यह आईओएस उपकरणों के लिए है। वास्तविक ड्रा कॉल: glDrawElements (GL_POINTS, num_particles, GL_UNSIGNED_SHORT, pindices);

क्या मुझे GL_STREAM_DRAW या GL_DYNAMIC_DRAW का उपयोग करना चाहिए?

उत्तर

1

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

VBO कैसे, यह देखने के लिए: VBO tutorial

संपादित सवाल का जवाब देने भूल: हाँ, यह एक अच्छा विचार है। लेकिन पहले उपाय।

+0

मुझे यह सच नहीं लगता कि वीबीओ हमेशा इष्टतम हैं, कई बफरसबडेट्स या इससे भी बदतर नक्शा बफर (क्योंकि इसे बफर को क्लाइंट में प्रतिलिपि बनाना है) के कारण ओवरहेड वर्टेक्स सरणी से ओवरहेड से भी बदतर हो सकता है। यह सच है कि यह निश्चित रूप से जानने के लिए प्रति वीडियोकार्ड की पूरी तरह से जांच करने योग्य है, मैं सिर्फ यह देख रहा हूं कि मैं भीड़ के ज्ञान से आकर्षित कर सकता हूं ... क्योंकि इस बिंदु पर मेरे मामले में परीक्षण प्रयास के लायक नहीं है। –

4

Apple's documentation सभी परिस्थितियों में वीबीओ की सिफारिश करने लगता है। यदि आप ES 2.x का उपयोग कर रहे हैं तो GL_STREAM_DRAW vertex बफर प्रकार स्पष्ट रूप से "जब आपके एप्लिकेशन को क्षणिक ज्यामिति बनाने की आवश्यकता होती है जिसे थोड़ी बार प्रदान किया जाता है और फिर त्याग दिया जाता है। यह तब सबसे उपयोगी होता है जब आपके एप्लिकेशन को गतिशील रूप से वर्टेक्स बदलना चाहिए प्रत्येक फ्रेम को ऐसे तरीके से डेटा करें जो एक कशेरुक शेडर में नहीं किया जा सकता है। " GlBufferSubData का उपयोग सीधे वकालत की जाती है।

तार्किक रूप से, मैं पूरी तरह से नए सिरे से डेटा की आपूर्ति और यह एक मौजूदा GL_STREAM_DRAW को भेजने या GL_DYNAMIC_DRAW बफर कि स्मृति नक्शे में अपने स्थान (GPU या CPU, चिप के आधार पर है के बीच फर्क सिर्फ इतना है लगता है - MBXs वास्तव में नहीं है वीबीओ करें लेकिन ऐप्पल अन्य प्रदर्शन कारणों के लिए उनका समर्थन करता है) आवंटित किए जाने और प्रत्येक फ्रेम को जारी करने के बजाए एक बार आवंटित किया जा सकता है।

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

+0

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

+0

इसके विपरीत, ऐप्पल के दस्तावेज़, जैसा कि मेरे उत्तर में जुड़ा हुआ है, स्पष्ट रूप से कहता है "अनलाइन किए गए डेटा को अधिक प्रोसेसिंग की आवश्यकता होती है, खासकर जब आपका एप्लिकेशन वर्टेक्स बफर का उपयोग करता है।" बहुत अंतिम वाक्य देखें। मान लें कि आप एक एडीसी सदस्य हैं, उदाहरण भी देखें https://devforums.apple.com/message/320610#320610, जो एक ऐप्पल कर्मचारी है जो संरेखण के गति लाभों को फिर से समझाता है।मेमोरी कंट्रोलर अक्सर दो पड़ोसी मूल्यों को पढ़कर और परिणामों को संयोजित करके असाइन किए गए मानों को पढ़ते हैं - इसलिए एक पढ़ने के बजाय दो स्मृति मेमोरी प्राप्त करता है। – Tommy

+0

ठीक है, मुझे आईफोन के बारे में कोई जानकारी नहीं है और मुझे पता नहीं था कि सवाल इसके लिए है। मेरा जवाब ओपनगल (पीसी के लिए) के लिए सामान्य है। –