Questa terminologia è radicata nella storia di OpenGL. La cosa importante da ricordare è che, per la maggior parte delle versioni GL che sono rilevanti qui, OpenGL si è evoluto in modo incrementale e aggiungendo nuove funzionalità a un'API già esistente anziché modificare l'API.
La prima versione di OpenGL non aveva nessuno di questi tipi di oggetti. Il disegno è stato ottenuto emettendo più chiamate glBegin / glEnd e un problema con questo modello era che era molto inefficiente, in termini di overhead delle chiamate di funzione.
OpenGL 1.1 ha fatto i primi passi per risolvere questo problema introducendo array di vertici. Invece di specificare direttamente i dati del vertice, ora è possibile generarli da array C / C ++, da cui il nome. Quindi un array di vertici è proprio questo: un array di vertici e lo stato GL richiesti per specificarli.
La successiva grande evoluzione è arrivata con GL 1.5 e ha consentito l'archiviazione dei dati dell'array di vertici nella memoria GPU piuttosto che nella memoria di sistema ("lato client"). Un punto debole delle specifiche dell'array di vertici GL 1.1 era che l'intero set di dati di vertici doveva essere trasferito alla GPU ogni volta che si voleva usarlo; se fosse già sulla GPU, questo trasferimento potrebbe essere evitato e si potrebbero ottenere potenziali miglioramenti delle prestazioni.
Quindi è stato creato un nuovo tipo di oggetto GL per consentire la memorizzazione di questi dati nella GPU. Proprio come un oggetto texture viene utilizzato per l'archiviazione dei dati texture, un oggetto buffer vertici memorizza i dati vertici. Questo è in realtà solo un caso speciale di un tipo di oggetto buffer più generale che può memorizzare dati non specifici.
L'API per l'utilizzo degli oggetti buffer vertici è stata supportata dalle API dell'array di vertici già esistenti, motivo per cui vengono visualizzate cose strane come la conversione degli offset di byte in puntatori. Quindi ora abbiamo un'API per array di vertici che memorizza solo lo stato, con i dati provenienti da oggetti buffer anziché da array in memoria.
Questo ci porta quasi alla fine della nostra storia. L'API risultante era piuttosto dettagliata quando si trattava di specificare lo stato dell'array di vertici, quindi un'altra via di ottimizzazione era quella di creare un nuovo tipo di oggetto che raccolse tutto questo stato insieme, consentisse più cambiamenti di stato dell'array di vertici in una singola chiamata API e consentisse GPU per eseguire potenzialmente ottimizzazioni grazie alla possibilità di sapere in anticipo quale stato sarebbe stato utilizzato.
Immettere l'oggetto array vertice, che raccoglie tutto questo insieme.
Quindi, per riassumere, un array di vertici ha iniziato la vita come una raccolta di stati e dati (memorizzati in un array) con cui disegnare. Un buffer di vertici sostituisce l'archiviazione di array in memoria con un tipo di oggetto GL, lasciando l' array di vertici solo in stato. Un oggetto array vertice è solo un oggetto contenitore per questo stato, che consente di modificarlo più facilmente e con meno chiamate API.
char* buffer = socketRead();
(pseudocodice). Il registro d'altra parte, vive per l'intero ciclo di vita dell'app. Quindi crei un array da qualche parte e inizi a leggere il socket, ogni volta che ottieni dati scrivi quel pezzo sull'array, dandoti un elenco accurato di tutti i dati che hai ricevuto.