È possibile verificare se una texture OpenGL ES su iPhone è stata veramente deallocata?
Domanda
Il manuale ti ha appena richiesto di scrivere:
glDeleteTextures(1, &GLtexture);
e afferma che la trama verrà eliminata. L'iPhone ha poca memoria e voglio assicurarmi che queste trame vengano davvero rilasciate.
Lo strumento Perdite non è in grado di rilevarlo e, francamente, sono un po 'preoccupato. Voglio davvero assicurarmi che le trame siano davvero sparite.
Grazie.
Soluzione
Le trame non sono gestite dal runtime di Obj-c, quindi le perdite non ne sanno nulla. Devi usare un altro strumento.
In Xcode avvia un nuovo progetto usando il modello OpenGL. Cerca il metodo che aggiorna / disegna la scena e aggiungi questo codice alla fine:
static int tick = -1;
static GLuint tex[5];
if (tick++ < 0)
for (int f = 0; f < 5; f++)
tex[f] = 0;
tick = tick % 5;
if (tex[tick]) {
glDeleteTextures(1, &tex[tick]);
tex[tick] = 0;
} else {
glGenTextures(1, &tex[tick]);
glBindTexture(GL_TEXTURE_2D, tex[tick]);
char *mem = malloc(1024 * 1024 * 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
free(mem);
}
Il codice genera e distrugge cinque trame usando i comandi OpenGL. Costruiscilo ed eseguilo una volta sul tuo dispositivo per assicurarti che sia installato. Non preoccuparti per il soffocamento.
Ora apri gli strumenti e inizia con il modello vuoto per iPhone. Apri la libreria e trascina Memory Monitor nella finestra. Fai clic sul pulsante di divulgazione delle informazioni e deseleziona tutto tranne "Quotazione memoria libera". Ora seleziona per avviare il file binario sul tuo iPhone per iniziare la registrazione. Dovresti vedere lo schema delle scale che sale / scende a seconda di quando Instruments tenta di campionare l'applicazione. Mentre il programma è in esecuzione, puoi vedere tutti i processi attivi con la colonna "Memoria reale", che mostra l'utilizzo effettivo della memoria.
Nei miei test, questo esempio consuma tra 25 MB e 3 MB a seconda del momento del campionamento della memoria. Questo è con un iPhone e SDK 3.1 di seconda generazione. Se si dispone di un SDK 2.x, è necessario cercare la Dimensione oggetto residente GART nel normale monitor OpenGL. Vedi http: // blog.zincroe.com/2009/04/how-to-check-iphone-texture-memory-usage-with-instruments/ per ulteriori riferimenti.
In ogni caso, la memoria che salta su e giù dimostra che glDeleteTexture () fa il suo lavoro come pubblicizzato.
Altri suggerimenti
Avvolgi le chiamate a glDeleteTextures (int, int *)
nella tua funzione che mantiene una tabella di allocazione.