2012-01-08 10 views
7

Prima di ridurre questo ad un esempio ragionevole Speravo che qualcuno potrebbe aver funzionato in questo prima e può far luce sul problema.OpenGL massimo di 32 finestre sullo schermo con Vista/7

Ho un'applicazione basata su 32 bit C che utilizza un contesto OpenGL per ogni finestra, tutti i contesti e le finestre sono impostati in modo identico. Il formato pixel richiesto è a colori a 32 bit, alfa, buffer di profondità, accelerato. Tutto funziona perfettamente su Windows 2000 e XP.

Tutto funziona perfettamente su Vista e 7 fino alla creazione della 33a finestra/coppia di contesto. La creazione della finestra non ha errori, la creazione del contesto non ha errori, rendendo il contesto corrente non ha errori, il disegno non produce errori, SwapBuffers non genera un errore. Tuttavia, i contesti OpenGL non riescono a produrre alcun output, con Aero le finestre sono bianche, con la modalità classica che non disegnano e sono solo spazzatura schermo. Killing the DWM non risolve il problema, provando diversi formati di pixel (buffer singolo, profondità diverse, ecc.) E PFD_SUPPORT_COMPOSITION non risolve il problema. Questo è su un numero di macchine diverse con Vista/7, mai XP.

Posso glReadPixels il buffer posteriore e sono i pixel corretti. Il rendering in un pbuffer con lo stesso contesto funziona bene, il rendering in> 32 pbuffers va bene.

Se riesco a utilizzare i contesti/finestre su schermo, le finestre non funzionanti riprendono a funzionare. È come se Vista/7 smettesse semplicemente di mostrare il rendering di OpenGL dopo che 32 finestre sono sullo schermo facendo questo.

Se il descrittore di formato pixel include PFD_SUPPORT_GDI tutto è ok, ma che sta utilizzando il renderer software che è inaccettabile.

Mi chiedo se questa è una limitazione del sistema operativo o la limitazione del driver in Vista/7. Grazie per qualsiasi intuizione.

+0

Qual è il comportamento se si crea 33 Windows collegati al medesimo contesto unico? – Luca

+2

Sospetto che questa sia una particolare implementazione del driver che è la colpa. Stai vedendo lo stesso comportamento su più schede/produttori? – eodabash

risposta

2

Il limite è specifico dell'implementazione e tutto ciò che è possibile fare è eseguire alcuni test sull'hardware comune.

ho corse alcuni test me stesso e si scopre che il limite è piuttosto alto per le schede GeForce (forse anche nessun limite). Per Quadro desktop, c'era un limite di 128 contesti che erano in grado di ridisegnare correttamente, il programma era in grado di creare 128 contesti in più senza errori, ma le finestre contenevano spazzatura. Non sto usando PFD_SUPPORT_GDI.

E 'stato ancora più interessante su ATi Radeon 6950, c'è il ridisegno fermato a finestra # 105, e la creazione di rendering contesto # 200 fallito.

Se si desidera provare da soli, il programma può essere trovato qui: Max OpenGL Contexts test (c'è codice sorgente completo + file binari Win32). Forse puoi guardare il codice e rintracciare il colpevole, sarebbe molto interessato a sentirlo.

Questo è il risultato. Un consiglio: evitare l'uso di più contesti laddove possibile. È possibile comprendere più contesti in un'applicazione in esecuzione su più monitor, ma le applicazioni su un singolo monitor devono ricorrere a un singolo contesto. Il cambio di contesto è lento. E non è tutto. Le applicazioni in cui le finestre OpenGL sono sovrapposte a un'altra finestra richiedono regioni di ritaglio hardware. C'è una regione di clipping hardware su GeForce, otto o più su Quadro (le applicazioni CAD usano spesso finestre e menu che si sovrappongono alla finestra OpenGL, in contrasto con i giochi). Nel caso in cui siano necessarie più regioni, il rendering ricade sul software - quindi ancora una volta - avere molte finestre OpenGL (contesti) non è una buona idea.

Nota questo è piuttosto simile a Is there a limit to how many OpenGL rendering contexts you can create simultaneously?

Problemi correlati