VBO'ları güncellemek ve aynı anda kullanmak için çok iş parçacıklı bir OpenGL uygulaması nasıl kullanılır?


11

Basit bir uygulamam var. Her biri kendi oluşturma bağlamına sahip iki iş parçacığı var, ancak bir VBO'yu paylaşıyorlar (bu çalışıyor, test ettim).

Şimdi ne istiyorum: Bir iş parçacığı VBO ilk yarısından bazı verileri render ve ikinci iş parçacığı VBO ikinci bölümünü güncelleştiriyor.

VBO'yu güncellemediğimde, iyi çalışıyor.

Ancak güncelleme sırasında bazı garip sorunlar yaşıyorum. glMapBufferVBO'yu güncellemek için kullandığımda (ikinci iş parçacığında), ilk iş parçacığında, çoğu zaman hiçbir şey yapmaz - tüm ekran açıktır (bir glCleararamadan sonra ). VBO'dan verilere dokunamıyor gibi görünüyor (bu anlaşılabilir, çünkü tüm tampon eşleştirildi ve böylece bir şekilde kilitlenebilir).

Kullanmaya çalıştım glMapBufferRange, hangi kullanır GL_MAP_UNSYNCHRONIZED_BIT. Bu, "beklemeyin ve VBO'yu istediğiniz gibi kullanın, ben (program) kendim senkronize edeceğim" anlamına gelmelidir. Ayrıca, bir dizi VBO'yu eşlediğimde ve başka bir bölümden veri oluşturduğumda, beklememeliyim, ancak aynı sorunları yaşıyorum glMapBuffer.

Birisi bunu düzeltmeme yardımcı olabilir veya neden olduğunu açıklayabilir mi?

Yanıtlar:


6

Birisi bu sorunla ilgileniyorsa , OpenGL forumunda çözüm bulabilirsiniz . Temel olarak, arabelleklere ne okuma ne de yazma için aynı anda iki iş parçacığı veya bağlam tarafından erişilemez. Bu nedenle, benzer bir kilitleme mekanizması std::mutexgereklidir.


Çözüme işaret ettiğiniz için teşekkür ederiz. Cevabınızı özetlemek için düzenledim.
danijar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.