2009-04-22 15 views
6

Attualmente sto caricando un'immagine in memoria su un secondo thread e quindi durante il ciclo di visualizzazione (se è richiesto un carico di texture), caricare la trama.Qual è un buon modo per caricare le trame in modo dinamico in OpenGL?

Ho scoperto che non potevo caricare la trama sul secondo thread perché a OpenGL non piaceva; forse è possibile, ma ho fatto qualcosa di sbagliato, quindi per favore correggimi se è possibile.

D'altra parte, se il mio errore era valido - come posso caricare una trama senza interrompere il ciclo di rendering? Attualmente le trame impiegano circa 1 secondo per caricare dalla memoria, e sebbene questo non sia un grosso problema, può essere leggermente irritante per l'utente.

+0

Sembra un tempo eccezionalmente lungo per caricare una trama in VRAM dalla memoria di sistema. Quanto è grande e stai avendo OpenGL generare livelli mipmap per te? –

+0

Molto grandi, sono immagini mediche. –

risposta

4

È possibile caricare una trama dal disco alla memoria su qualsiasi filo che ti piace, utilizzando qualsiasi strumento desideri leggere i file.

Tuttavia, quando lo si associa ad OpenGL, sarà necessario gestirlo sullo stesso thread del rendering per quel contesto OpenGL. Detto questo, this discussion suggerisce che l'utilizzo di un PBO in un secondo thread è un'opzione e può accelerare il processo.

+0

Primo paragrafo non così utile, una specie di ripetizione di quello che ho detto hehe;) ma il 2 ° paragrafo sembra molto utile, grazie per il link! Sicuramente lo verificherò :) –

+0

Solo dicendo che quello che stavi facendo è valido - non ero sicuro da come lo hai scritto se era così. In bocca al lupo! –

+0

Capito. Grazie! :) –

1

È possibile caricare la trama da disco in RAM in qualsiasi numero di thread che si desidera, ma OpenGL non verrà caricato in VRAM in più thread per il motivo indicato nella risposta di Reed.

Dato il caricamento da disco è la parte più lenta, questo è il bit che probabilmente vorrai inserire. I thread di caricamento creano una coda di trame da caricare, quindi questa coda viene consumata dal thread che possiede il contesto GL (attenzione però al tuo accesso a quella coda dai vari thread). Si potrebbe anche considerare un approccio non-threaded del caricamento di N texture per frame, dove N è un numero che non rallenta troppo il rendering.

+0

@Justin, grazie per aver trovato il tempo di rispondere. Forse la mia domanda è formulata male; attualmente il carico pesante viene eseguito nel 2 ° thread (questo richiede circa 10 secondi per caricare perché c'è un po 'di elaborazione dell'immagine), quindi ci vuole solo un breve istante per copiare i pixel in VRAM durante il ciclo GLUT; tuttavia, sebbene sia breve, richiede una "scomoda" quantità di tempo in termini di esperienza utente. –

+0

Okey, è logico - inserisci una risposta qui quando capisci cosa funziona per te! – Justicle

Problemi correlati