Come utilizzare un'applicazione OpenGL multi-thread per aggiornare i VBO e utilizzarli contemporaneamente?


11

Ho una semplice applicazione. Ha due thread, ognuno con il proprio contesto di rendering, ma condividono un VBO (funziona, l'ho testato).

Ora quello che voglio: un thread sta visualizzando alcuni dati dalla prima metà del VBO e il secondo thread sta aggiornando la seconda parte del VBO.

Quando non aggiorno il VBO, funziona bene.

Ma ho alcuni strani problemi durante l'aggiornamento. Quando uso glMapBufferper aggiornare il VBO (nel secondo thread), nel primo thread, il più delle volte, non viene visualizzato nulla: l'intero schermo è chiaro (dopo una glClearchiamata). Sembra che non possa toccare i dati dal VBO (questo è comprensibile, perché l'intero buffer è mappato e quindi può essere bloccato in qualche modo).

Ho provato a usare glMapBufferRange, che usa GL_MAP_UNSYNCHRONIZED_BIT. Questo dovrebbe significare "non aspettare e usare il VBO come vuoi, io (il programma) lo sincronizzerò da solo". Inoltre, quando eseguo il mapping di una gamma di VBO e il rendering dei dati da un'altra parte, non dovrebbe essere in attesa, ma sto riscontrando gli stessi problemi con cui mi trovo glMapBuffer.

Qualcuno può aiutarmi a risolvere questo problema o spiegare perché succede?

Risposte:


6

Se qualcuno è interessato a questo problema, puoi trovare una soluzione sul forum OpenGL . Fondamentalmente, i buffer non sono accessibili da due thread o contesti contemporaneamente, né per la lettura né per la scrittura. Pertanto, std::mutexè necessario un meccanismo di blocco come .


Grazie per aver indicato la soluzione. Ho modificato la tua risposta per sintetizzarla.
danijar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.