จะใช้แอพพลิเคชั่น OpenGL แบบมัลติเธรดเพื่ออัพเดต VBOs และใช้งานพร้อมกันได้อย่างไร?


11

ฉันมีแอพพลิเคชั่นที่เรียบง่าย มันมีสองกระทู้แต่ละคนมีบริบทการแสดงผลของตัวเอง แต่พวกเขาแบ่งปัน VBO หนึ่ง (นี้ใช้งานได้ผมทดสอบมัน)

ตอนนี้สิ่งที่ฉันต้องการ: หนึ่งเธรดกำลังแสดงผลข้อมูลบางส่วนจากครึ่งแรกของ VBO และเธรดที่สองกำลังอัปเดตส่วนที่สองของ VBO

เมื่อฉันไม่อัปเดต VBO มันก็ใช้ได้ดี

แต่ฉันมีปัญหาแปลก ๆ บางอย่างเมื่ออัปเดต เมื่อฉันใช้glMapBufferเพื่ออัปเดต VBO (ในเธรดที่สอง), ในเธรดแรก, โดยส่วนใหญ่, มันไม่มีการแสดงผลใด ๆ - ทั้งหน้าจอนั้นชัดเจน (หลังจากการglClearโทร) ดูเหมือนว่าจะไม่สามารถสัมผัสข้อมูลจาก VBO (เป็นที่เข้าใจได้เพราะบัฟเฟอร์ทั้งหมดถูกแมปและดังนั้นจึงสามารถล็อคได้อย่างใด)

ผมพยายามที่จะใช้ซึ่งการใช้งานglMapBufferRange GL_MAP_UNSYNCHRONIZED_BITนี่ควรหมายความว่า "อย่ารอและใช้ VBO ตามที่คุณต้องการฉัน (โปรแกรม) จะซิงโครไนซ์ด้วยตนเอง" นอกจากนี้เมื่อฉัน map ช่วงของ VBOs และแสดงผลข้อมูลจากส่วนอื่นก็ไม่ควรจะรอ glMapBufferแต่ฉันประสบปัญหาเดียวกับผมด้วย

ใครสามารถช่วยฉันแก้ไขหรืออธิบายได้ว่าทำไมมันถึงเกิดขึ้น

คำตอบ:


6

หากมีใครสนใจในปัญหานี้คุณสามารถหาทางออกในฟอรั่ OpenGL โดยทั่วไปบัฟเฟอร์ไม่สามารถเข้าถึงได้โดยสองเธรดหรือบริบทพร้อมกันไม่ว่าจะเป็นการอ่านหรือเขียน ดังนั้นจึงstd::mutexจำเป็นต้องใช้กลไกการล็อค


ขอบคุณสำหรับการชี้ไปที่โซลูชัน ฉันแก้ไขคำตอบของคุณเพื่อสรุป
danijar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.