2011-09-14 10 views
6

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

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

उत्तर

8

इस संदर्भ में वीबीओ आवंटित/अद्यतन करने का सबसे प्रभावी तरीका क्या है? मुझे पूरा यकीन है कि मुझे प्रत्येक ऑब्जेक्ट को अपडेट करने के लिए DYNAMIC_DRAW और bufferSubData का उपयोग करना चाहिए।

यह वास्तव में जाने का तरीका है। असल में आप अपनी ऑब्जेक्ट्स के लिए डबल या यहां तक ​​कि ट्रिपल बफरिंग का उपयोग करना चाहते हैं, यानी एक नया वीबीओ ड्राइंग के लिए बाध्य है, जबकि आप नए डेटा के साथ दूसरे की सामग्री अपडेट करते हैं। glMapBuffer मेमोरी मानचित्र को प्रक्रिया में सभी थ्रेड से एक्सेस किया जा सकता है, इसलिए आपके पास "बैक" वर्टेक्स बफर अपडेट करने वाला वर्कर थ्रेड हो सकता है, जबकि प्रतिपादन थ्रेड वर्तमान फ्रेम को चित्रित करने में व्यस्त है।

या स्मृति स्मृति पदचिह्न के मामले में यह इतना छोटा है कि मैं अधिक सोच रहा हूं?

क्या आपने सबसे खराब केस मेमोरी पदचिह्न का मूल्यांकन किया है जिसका आप सामना कर रहे हैं? आपकी संख्याओं को देखते हुए, मुझे लगता है कि यह 16 एमआईबी से नीचे होगा (150 ऑब्जेक्ट्स * 2048 अंक * 3 डबल परिशुद्धता फ्लोट प्रति बिंदु * 8 बाइट प्रति डबल = 7.4 एमआईबी, केवल 3.7 एमआईबी यदि एकल परिशुद्धता फ्लोट का उपयोग किया जाता है)। इसकी तुलना करें कई सैकड़ों एमआईबी रैम आधुनिक ग्राफिक्स कार्ड ऑफ़र (मेरी 2006 GeForce 8800GTX में 768 एमआईबी रैम है, और मेरे राडेन एचडी 6570 में 1024 एमआईबी (= 1 जीआईबी) है।