सबसे सही उत्तर है, यह इस बात पर निर्भर करता है कि आप इसे कैसे प्रोग्राम करते हैं, लेकिन यह चिंता करने के लिए एक अच्छी बात है। जबकि GPU अविश्वसनीय रूप से तेज हो गया है, GPU RAM से बैंडविड्थ और नहीं, और आपकी सबसे निराशाजनक अड़चन होगी।
क्या इसका डेटा केवल एक बार GPU मेमोरी में भेजा जाता है और हमेशा के लिए वहां बैठ जाता है?
आशापूर्वक हाँ। रेंडरिंग स्पीड के लिए, आप हर फ्रेम में फिर से भेजने के बजाय, GPU पर बैठने के लिए जितना डेटा चाहते हैं। VBO का यह सटीक उद्देश्य है। दोनों स्थैतिक और गतिशील वीबीओ हैं, पूर्व स्थैतिक मॉडल के लिए सबसे अच्छा है, और बाद वाले उन मॉडलों के लिए सबसे अच्छा है, जिनके कोने हर फ्रेम (जैसे, एक कण प्रणाली) को बदल देंगे। यहां तक कि जब यह गतिशील वीबीओ की बात आती है, हालांकि, आप हर फ्रेम में सभी छोरों को फिर से नहीं भेजना चाहते हैं; बस जो बदल रहे हैं।
आपके भवन के मामले में, वर्टेक्स डेटा बस वहां बैठ जाएगा, और केवल एक चीज जो परिवर्तन होती है वह आपके मैट्रिसेस (मॉडल / दुनिया, प्रक्षेपण और दृश्य) हैं।
एक कण प्रणाली के मामले में, मैंने एक गतिशील वीबीओ को काफी बड़ा बना दिया ताकि उस प्रणाली के लिए मौजूद कणों की अधिकतम संख्या को संग्रहीत किया जा सके। प्रत्येक फ्रेम मैं उस फ्रेम के उत्सर्जित कणों के लिए डेटा भेजता हूं, साथ में कुछ जोड़े भी। जब मैं आकर्षित करता हूं, तो मैं उस वीबीओ में एक शुरुआत और अंत बिंदु निर्दिष्ट कर सकता हूं, इसलिए मुझे कण डेटा को हटाने की आवश्यकता नहीं है। मैं बस कह सकता हूं कि उन्हें आकर्षित मत करो।
जब मॉडल वास्तव में प्रत्येक फ्रेम प्रदान करता है तो GPU प्रोसेसर को GPU मेमोरी से हर बार अपना डेटा प्राप्त करना पड़ता है? मेरा क्या मतलब है - अगर मेरे पास 2 मॉडल हैं, तो मैंने हर बार कई बार काम किया है - क्या इससे कोई फर्क पड़ेगा कि अगर मैंने पहली बार पहली बार कई बार और फिर दूसरी बार कई बार या अगर मैंने पहली बार सिर्फ एक बार गाया है, तो दूसरा सिर्फ एक बार। इस तरह interleaving रखा?
सिर्फ एक के बजाय कई ड्रा कॉल भेजने की क्रिया एक बहुत बड़ी सीमा है। उदाहरण प्रस्तुत करने की जाँच करें; यह आपकी बहुत मदद कर सकता है और इस प्रश्न के उत्तर को बेकार कर सकता है। मेरे पास इसके कुछ ड्राइवर मुद्दे थे जिनसे मैंने अभी तक काम नहीं किया है, लेकिन अगर आप इसे काम कर सकते हैं, तो समस्या हल हो जाएगी।
जाहिर है ग्राफिक्स कार्ड में रैम सीमित होती है - जब यह 1 फ्रेम रेंडर करने के लिए आवश्यक सभी मॉडल डेटा को पकड़ नहीं सकता है, तो मुझे लगता है कि यह (कुछ) सीपीयू रैम से प्रत्येक फ्रेम प्राप्त करता रहता है, क्या यह सही है?
आप GPU RAM से बाहर नहीं भागना चाहते हैं। यदि आप करते हैं, तो चीजों को बदल दें ताकि आप न करें। बहुत काल्पनिक परिदृश्य में, जो आप रन आउट करते हैं, यह शायद किसी तरह दुर्घटनाग्रस्त हो जाएगा, लेकिन मैंने ऐसा कभी नहीं देखा है इसलिए मैं ईमानदारी से नहीं जानता।
मैं एक भेद करना भूल गया: जीपीयू में डेटा भेज रहा है और बफ़र्स को वर्तमान के रूप में सेट / बाइंड कर रहा है। क्या बाद वाला कोई डेटा प्रवाह करता है?
कोई महत्वपूर्ण डेटा प्रवाह नहीं, नहीं। इसकी कुछ लागत है, लेकिन यह आपके द्वारा लिखी गई कोड की प्रत्येक पंक्ति के लिए सही है। यह पता लगाना कि आप कितना खर्च कर रहे हैं, फिर से, प्रोफाइलिंग किस लिए है।
आरंभीकरण के साथ बफर निर्माण
रक्सवन का जवाब अच्छा लगता है, लेकिन यह बिल्कुल सटीक नहीं है। ओपनजीएल में, बफर बनाना किसी भी स्थान को आरक्षित नहीं करता है। यदि आप कोई डेटा पास किए बिना स्थान आरक्षित करना चाहते हैं, तो आप glBufferData को कॉल कर सकते हैं और बस पास कर सकते हैं। (नोट अनुभाग यहां देखें )
बफ़र डेटा अद्यतन
मैं अनुमान लगा रहा हूँ कि आप glBufferData, या उस जैसे अन्य कार्यों का मतलब है, है ना? यह वह जगह है जहां वास्तविक डेटा ट्रांसफर होता है। (जब तक आप अशक्त न हों, जैसे मैंने पिछले पैराग्राफ में कहा था।)
बफर को सक्रिय के रूप में बांधना (क्या यह एपीआई को बताने का एक तरीका है कि मैं चाहता हूं कि यह बफर अगले ड्रॉ कॉल में प्रदान किया जाए और यह अपने आप कुछ भी नहीं करता है?)
हां, लेकिन यह उससे थोड़ा ज्यादा कर सकता है। उदाहरण के लिए, यदि आप एक VAO (वर्टेक्स एरे ऑब्जेक्ट) को बांधते हैं, तो एक VBO को बांधते हैं, कि VBO VAO से बंध जाता है। बाद में, यदि आप उस वीएओ को फिर से बांधते हैं, और glDrawArrays को कॉल करते हैं, तो यह पता चलेगा कि वीबीओ को क्या आकर्षित करना है।
ध्यान दें कि जब कई ट्यूटोरियल हर VBO के लिए एक VAO बनाएंगे, तो मुझे बताया गया है कि यह उनका इच्छित उपयोग नहीं है। माना जाता है कि आपको एक VAO बनाना चाहिए और प्रत्येक VBO के साथ उसी गुण का उपयोग करना चाहिए। मैंने अभी तक यह कोशिश नहीं की है, इसलिए मैं यह सुनिश्चित करने के लिए नहीं कह सकता कि यह कोई बेहतर या बुरा है।
एपीआई ड्रा कॉल
यहाँ जो होता है वह बहुत सीधा (हमारे दृष्टिकोण से) है। कहते हैं कि आप एक VAO बाँधते हैं, तो glDrawArrays को कॉल करें। आप एक प्रारंभिक बिंदु, और एक गिनती निर्दिष्ट करते हैं, और यह उस सीमा में प्रत्येक शीर्ष के लिए अपना शीर्ष shader चलाता है, जो बदले में लाइन के नीचे अपने आउटपुट को पास करता है। यह पूरी प्रक्रिया अपने आप में एक और निबंध है, हालांकि।