GL_STATIC_DRAW vs GL_DYNAMIC_DRAW vs GL_STREAM_DRAW: importa?


11

In OpenGL le funzioni degli oggetti buffer ( glBufferData, glBufferSubDatae probabilmente alcuni altri) hanno un parametro usage, descritto dalla documentazione come un suggerimento dell'uso previsto, probabilmente destinato ad aiutare l'implementazione a produrre prestazioni migliori.

uso

Specifica il modello di utilizzo previsto dell'archivio dati. La costante simbolica deve essere GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, o GL_DYNAMIC_COPY.
[...] l'
utilizzo è un suggerimento per l'implementazione GL su come si accederà all'archivio dati di un oggetto buffer. Ciò consente all'implementazione GL di prendere decisioni più intelligenti che possono influire in modo significativo sulle prestazioni degli oggetti buffer. Tuttavia, non limita l'utilizzo effettivo dell'archivio dati.

Il wiki è altrettanto vago:

Questi sono solo suggerimenti, dopo tutto. È un codice OpenGL perfettamente legale modificare un buffer STATIC dopo che è stato creato o non modificare mai un buffer STREAM.
[...]
Queste sono domande a cui è possibile rispondere solo con un'attenta profilazione. E anche in questo caso, la risposta sarà accurata solo per quella particolare versione del driver da quel particolare fornitore di hardware.

Bene, quanto è importante questo parametro, se non del tutto? I conducenti ne tengono effettivamente conto e, se lo fanno, secondo la tua esperienza quanto influisce sulle prestazioni in pratica? Hai dati da condividere?

Ho scritto un sottile livello di astrazione per l'API grafica pensato per essere implementato come una delle API esistenti ed è allettante tentare di ignorare del tutto questo parametro e nasconderlo dall'astrazione esposta.

Risposte:


7

Questo varierà tra le implementazioni, ma il driver su cui ho lavorato le ha usate, principalmente per decidere il layout della memoria. Le ottimizzazioni hanno consentito da questi suggerimenti sono molto più piccole di quanto si vorrebbe, soprattutto a causa della restrizione che si può fare qualsiasi uso qualunque suggerimenti si dà. ad esempio, renderebbe molto più economica l'annullamento della cache se i buffer accennati per l'accesso in sola lettura non potessero essere scritti affatto, ma questa ottimizzazione è impossibile.

Alcuni giochi noti che sono ampiamente utilizzati per confronti tra benchmark delle GPU non usano questi suggerimenti correttamente, quindi i venditori di GPU hanno un incentivo a fare tutti gli usi velocemente anche se non corrispondono ai suggerimenti.


4

Funzionalmente sono gli stessi.

Il driver potrebbe usarli per differenziare come gestire il buffer dietro le quinte. Dove ad esempio static_draw verrebbe copiato in vram il più presto possibile e lasciato lì, ma stream_read avrebbe sempre una copia op-to-date nella RAM.

Questa vaghezza è la ragione per cui glBufferStorage è diventato una cosa. In questo modo specifichi cosa vuoi essere in grado di fare con il buffer (se lo aggiornerai tramite BufferSubData, se leggerai o scriverai attraverso una mappa, quanto sia coerente la mappatura, se la mappatura può persistere tra gli usi) e andare oltre quei confini è un errore.

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.