Supponendo che si stia generando una nuova trama con glGenTextures
ogni volta che si chiama glTexImage2D
, si spreca memoria e si perde se non si tiene traccia di tutte le trame generate. glTexImage2D
acquisisce i dati di input e li archivia nella memoria della scheda video. Il nome della trama che si lega prima di chiamare glTexImage2D
- quello che si genera con glGenTextures
è un handle per quel blocco di memoria della scheda video.
Se la trama è grande e si sta allocando nuova memoria per archiviare più e più copie di esso ogni volta che la si utilizza, si esaurirà rapidamente la memoria. La soluzione è chiamare glTexImage2D
una volta durante l'inizializzazione dell'applicazione e chiamare solo glBindTexture
quando si desidera utilizzarlo. Se si desidera modificare la trama stessa quando si fa clic, chiamare solo glBindTexture
e glTexImage2D
. Se la tua nuova immagine ha le stesse dimensioni dell'immagine precedente, puoi chiamare glTexSubImage2D
per dire a OpenGL di sovrascrivere i vecchi dati dell'immagine invece di eliminarli e caricarne uno nuovo.
UPDATE
In risposta al nuovo codice, sto aggiornando la mia risposta con una risposta più specifica. Hai a che fare con trame OpenGL in modo completamente sbagliato L'output di glGenTextures
è un GLuint[]
e non un String
o char[]
. Per ogni trama generata con glGenTextures
, OpenGL restituisce un handle (come un numero intero senza segno) a una trama. Questo handle memorizza lo stato che gli viene dato con glTexParameteri
e un pezzo di memoria sulla scheda grafica se gli dai dati con glTexImage[1/2/3]D
. Spetta a te memorizzare l'handle e inviarlo nuovi dati quando si desidera aggiornarlo. Se si sovrascrive l'handle o si dimentica, i dati rimangono nella scheda grafica ma non è possibile accedervi. Sei anche dicendo OpenGL per generare 3 texture quando hai solo bisogno 1.
Visto che texture_data
è di una dimensione fissa, è possibile aggiornare la texture con glTexSubImage2D
invece di glTexImage2D
. Qui è il codice modificato per evitare la perdita di memoria da questo problema:
texture_data = new GLubyte[width*height]();
GLuint texname; //handle to a texture
glGenTextures(1, &texname); //Gen a new texture and store the handle in texname
//These settings stick with the texture that's bound. You only need to set them
//once.
glBindTexture(GL_TEXTURE_2D, texname);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//allocate memory on the graphics card for the texture. It's fine if
//texture_data doesn't have any data in it, the texture will just appear black
//until you update it.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
GL_UNSIGNED_BYTE, texture_data);
...
//bind the texture again when you want to update it.
glBindTexture(GL_TEXTURE_2D, texname);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, 0, GL_RGB,
GL_UNSIGNED_BYTE, texture_data);
...
//When you're done using the texture, delete it. This will set texname to 0 and
//delete all of the graphics card memory associated with the texture. If you
//don't call this method, the texture will stay in graphics card memory until you
//close the application.
glDeleteTextures(1, &texname);
Il codice effettivo sarebbe utile per rintracciare questo problema. –
@NicolBolas, ho inserito il codice, grazie per aver menzionato +1 – Shan