Qual è il modo più veloce per riempire più volte una finestra con i dati RGB da un array?

StackOverflow https://stackoverflow.com/questions/4120542

  •  29-09-2019
  •  | 
  •  

Domanda

Attualmente sto scrivendo un gioco semplice. I miei esegue il codice grafico una volta per frame (circa 30 volte al secondo), e scrive i dati RGB a un array con 640 * 480 = 307200 voci.

Ho creato una finestra Win32 con superficie cliente esattamente 640 x 480 pixel. Qual è il modo più veloce per ottenere i miei dati RGB visualizzati all'interno della finestra altrimenti vuoto?

La finestra dovrà essere aggiornato ogni fotogramma, quindi ho bisogno di evitare lo sfarfallio. Dovrei usare GDI per questo? O c'è un veloce approccio utilizzando un diverso biblioteca -? Per esempio, DirectDraw

Modifica

Grazie per tutte le risposte. In primo luogo, mi permetta escludo Direct2D come opzione - ho bisogno di supportare Windows XP. In secondo luogo, ho un background in 3D in modo che il metodo suggerito da Yann Ramin e Ben Voigtto - uso Direct3D / OpenGL e un singolo quad strutturato - è come ho sempre fatto in passato

.

Tuttavia, ero interessato a scoprire se un API 2D sarebbe una soluzione migliore. Dal momento che non v'è stata alcuna risposta definitiva, ho buttato insieme un programma di test. Il codice visualizza semplicemente un framebuffer sullo schermo ripetutamente, il più velocemente possibile.

Ho inviato i miei risultati come parte di questo follow-up domanda .

È stato utile?

Soluzione

Il meglio che si può fare utilizzando GDI è l'uso SetDIBitsToDevice per copiare direttamente i dati RGB dal vostro allineamento alla finestra. Naturalmente, DirectX è la strada da percorrere se avete bisogno di eliminare completamente tremolante.

Altri suggerimenti

GDI non è assolutamente la strada da percorrere.

Il modo migliore cross-finestre-versione è quello di utilizzare Direct3D, e semplicemente aggiornare la texture su un singolo quad a schermo intero.

Direct2D è una nuova API (Win Vista con Service Pack e al di sopra) che è il meccanismo preferito se non è necessario il supporto XP. maniglie Direct2D font e altre attività a livello di sistema in modo accelerato.

Usa DirectDraw. Ho avuto un gioco a schermo pieno di vita che era bottiglia a collo sul disegno dei pixel quando ho usato GDI e dopo sono passato a DirectDraw ho iniziato a pompare fuori 60 fps con facilità.

La funzione GDI SetDIBitsToDevice funzionerà bene.

una trama allo quad come suggerito da theatrus funziona così, tranne che non deve essere a tutto schermo e OpenGL è di gran lunga l'opzione più portatile, per rendere questo accada, vedere glTexSubImage2D

Un modo molto più diretto è glDrawPixels

Idealmente, però, il codice grafico userebbe GPU rendering con accelerazione GPU direttamente nella memoria, quindi non avrebbe bisogno di preoccuparsi di spostare i bit di memoria di sistema nella GPU.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top