VBO को अपडेट करने और एक ही समय में उनका उपयोग करने के लिए मल्टी-थ्रेड OpenGL एप्लिकेशन का उपयोग कैसे करें?


11

मेरे पास एक साधारण आवेदन है। इसके दो सूत्र हैं, प्रत्येक का अपना प्रतिपादन प्रसंग है, लेकिन वे एक VBO को साझा करते हैं (यह काम कर रहा है, मैंने इसका परीक्षण किया)।

अब मुझे क्या चाहिए: एक धागा VBO के पहले भाग से कुछ डेटा प्रदान कर रहा है और दूसरा धागा VBO के दूसरे भाग को अपडेट कर रहा है।

जब मैं VBO को अपडेट नहीं करता, तो यह ठीक काम कर रहा है।

लेकिन अद्यतन करते समय मेरे पास कुछ अजीब मुद्दे हैं। जब मैं glMapBufferVBO (दूसरे थ्रेड में) को अपडेट करने के लिए उपयोग करता हूं, तो पहले थ्रेड में, ज्यादातर समय, यह कुछ भी नहीं देता है - पूरी स्क्रीन स्पष्ट ( glClearकॉल के बाद )। ऐसा लगता है कि यह वीबीओ से डेटा को नहीं छू सकता है (यह समझ में आता है, क्योंकि पूरे बफर को मैप किया गया है और इसलिए इसे किसी भी तरह से लॉक किया जा सकता है)।

मैंने उपयोग करने की कोशिश की glMapBufferRange, जो उपयोग करता है GL_MAP_UNSYNCHRONIZED_BIT। इसका मतलब यह होना चाहिए, "वीबीओ का इंतजार और उपयोग न करें जैसा आप चाहते हैं, मैं (कार्यक्रम) इसे खुद से सिंक्रनाइज़ करूंगा"। इसके अलावा, जब मैं VBO की एक श्रृंखला को मैप करता हूं और किसी अन्य भाग से डेटा रेंडर करता हूं, तो इसका इंतजार नहीं किया जाना चाहिए, लेकिन मैं उन्हीं मुद्दों का अनुभव कर रहा हूं जैसे मैं कर रहा हूं glMapBuffer

क्या कोई मुझे इसे ठीक करने या समझाने में मदद कर सकता है कि ऐसा क्यों होता है?

जवाबों:


6

यदि कोई व्यक्ति इस समस्या में रुचि रखता है, तो आप OpenGL मंच पर समाधान पा सकते हैं । मूल रूप से, बफ़र्स को एक साथ दो थ्रेड्स या संदर्भों द्वारा एक्सेस नहीं किया जा सकता है, न तो पढ़ने और न ही लिखने के लिए। इसलिए, एक ताला तंत्र की तरह std::mutexकी जरूरत है।


समाधान की ओर इशारा करने के लिए धन्यवाद। मैंने इसे संक्षेप में देने के लिए आपके उत्तर को संपादित किया।
दानीजार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.