Una volta che un programma è stato scritto, spesso l’ottimizzazione del codice e dei file di dati può richiedere lo stesso tempo necessario per scrivere il codice in primo luogo. Ciò è particolarmente vero quando si tenta di migliorare le prestazioni di OpenGL®. Molti fattori possono influenzare le prestazioni, dalle dimensioni e dal formato dei file di texture alla quantità di geometria in una scena, alle opzioni di rendering utilizzate durante la rasterizzazione. In realtà, l’aggiunta di codice può velocizzare l’esecuzione di un programma se tale codice ha lo scopo di rilevare ed evitare funzioni speciali non supportate da una scheda grafica. Le buone pratiche di programmazione e la comprensione dei colli di bottiglia delle prestazioni OpenGL® comuni possono fare molto per migliorare la velocità e la qualità di un’applicazione OpenGL®.
Un’area in cui si possono ottenere grandi miglioramenti alle prestazioni di OpenGL® è all’interno delle strutture dati dell’applicazione stessa. Le scene e le animazioni OpenGL® di solito richiedono una grande quantità di alberi di dati, strutture di dati e array. L’utilizzo di strutture contenitore e algoritmi di ricerca che utilizzano il minor tempo possibile pur continuando a soddisfare le esigenze dell’applicazione può accelerare la velocità con cui i dati vengono elaborati e spostati all’unità di elaborazione grafica (GPU) per la visualizzazione. Anche comprendere come OpenGL® richiede la formattazione dei dati può essere d’aiuto, poiché potrebbero verificarsi alcune ottimizzazioni in fase di compilazione a seconda del linguaggio utilizzato.
I file di texture sono un’area comune in cui è possibile migliorare le prestazioni di OpenGL®. Questi file di immagine dovrebbero avere dimensioni in pixel che sono solo potenze di due, anche se l’hardware non lo richiede. Dovrebbero anche essere ottimizzati all’interno di un editor di immagini per essere il più piccolo possibile. In genere, gli oggetti animati o in movimento non necessitano di texture dettagliate quanto gli oggetti che rimangono fermi. L’utilizzo delle trame più piccole possibili senza sacrificare troppa qualità può aumentare notevolmente il frame rate.
Una trappola comune, specialmente per i nuovi programmatori o artisti, è usare troppa geometria. Esistono numerosi trucchi che possono aiutare a ridurre il numero di poligoni in un modello senza sacrificare i dettagli. Un errore spesso commesso consiste nell’utilizzare la geometria di un modello per rappresentare dettagli che possono essere mostrati in modo molto più efficiente in un’immagine di trama. La maggior parte dei modelli sono in realtà molto semplici e le funzionalità complesse sono davvero implementate utilizzando mappe di rilievo, normali e mappatura delle texture. I modelli semplificati e ottimizzati aumenteranno le prestazioni di OpenGL® riducendo il numero di calcoli che devono essere eseguiti su ciascun vertice.
Per alcune applicazioni, può essere utile programmare per il minimo comune denominatore quando si tratta di hardware. Alcune schede grafiche di fascia alta implementano funzionalità OpenGL® che sono incredibilmente interessanti ma non supportate dalla maggior parte delle altre schede. Utilizzando poche estensioni e facendo affidamento sull’accelerazione hardware solo per le attività di base, le prestazioni di OpenGL® possono essere migliorate su quasi tutti i sistemi, prevenendo situazioni in cui una determinata linea di schede grafiche non è in grado di raggiungere un frame rate accettabile.
Anche il software di profilazione è molto importante quando si tenta di migliorare le prestazioni di OpenGL®. Un profiler misurerà il tempo necessario per eseguire ogni riga di codice, ogni funzione e ogni operazione all’interno di un programma. Questo può essere un modo incredibilmente efficace per identificare la posizione di un collo di bottiglia. Se una determinata funzione impiega più tempo di altre, può essere mirata per l’ottimizzazione. Questo a volte può portare a riscritture estese di determinati segmenti di codice ma, alla fine, può creare un programma che funziona nel modo più fluido possibile.