- 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.
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.
Ultimi commenti