Memoria schede video ed OpenGL

Matteo - 26 apr 2005 01:43
Si pensa comunemente che le schede video di oggi abbiano memoria in quantita' sufficiente per qualunque applicazione plausibile. Questo non e' vero:
  • molti portatili, anche recenti, hanno schede video con poca memoria o prendono la memoria in prestito da quella centrale: maggiore e' la memoria della scheda video, minore la RAM fisica a disposizione.
  • se il target non e' quello dei videogiocatori o di utenti business all'ultima moda, bisogna tener conto che molte macchine anche solo di 2 anni fa hanno schede video con un quarto della memoria delle schede di oggi, nella migliore delle ipotesi.
  • se nella propria applicazione la quantita' di elementi da rappresentare cresce, se si usano texture, se si usa il picking di opengl, se si usano buffer ausiliari (z-buffer, stencil, auxiliary...), la memoria non e' MAI abbastanza.
Per questi motivi, e' sempre bene fare attenzione all'uso della memoria in opengl, ed andare al risparmio. Si potrebbe quasi dire, con un termine che non ha senso da anni per come si sta evolvendo la programmazione oggi, OTTIMIZZARE l'uso della memoria della scheda video.

Una cosa molto semplice che ho imparato lavorando alla tesi, incentrata sulla rappresentazione di grandi quantita' di dati in forma grafica con OpenGL, e' che le liste di OpenGL vengono liberate non alla chiamata del glBeginList, ma a quella del glEndList. Spiego meglio. E' prassi comune - e corretta - utilizzare sempre lo stesso indice per una lista specifica. Se ad un certo punto la lista deve cambiare, si chiama il glBeginList con lo stesso indice e si sovrascrive la lista precedente. Il problema, che da quanto ne so' e' documentato pochissimo, e' che la memoria utilizzata dalla lista precedente (lista dei vertici e qualunque altra informazione necessaria) viene recuperata solo alla chiusura della nuova lista, ovvero chiamando glEndList. Questo vuol dire che la memoria occupata da una lista e' effettivamente il doppio di quella attesa, almeno durante la scrittura della lista stessa. Se non si fa attenzione a questo problema, si puo' ottenere un crash dell'applicazione dovuto alla scrittura fuori memoria video, assolutamente non controllato dai driver opengl.

Non saprei dire qual e' il miglior modo per evitare questa occupazione doppia, ma ne suggerisco due:

  • utilizzare glDeleteLists prima di ogni glBeginList, sebbene non sia formalmente corretto dato che glDeleteLists indicherebbe che l'applicazione ha finito di utilizzare le liste di quegli indici; sembra inoltre una soluzione piu' onerosa dal punto di vista computazionale; in ogni caso questa soluzione non mi ha mai dato grossi problemi.
  • utilizzare una coppia glBeginList/glEndList prima dell'effettivo glBeginList; questa e' al momento la soluzione che preferisco.
 
Weblog Koan Progetti Foto Contatti DW.net map