Come faccio a sapere se la memoria non viene gestita correttamente?


12

L'impronta di memoria del mio gioco (2D) sembra aumentare ogni volta che carico una trama, ad esempio quando avvio il gioco utilizza una RAM privata da 30 MB, dopo aver attraversato un file di sfondo di ~ 367 MB, quindi a un certo punto è tutto in RAM, aumenta a 54 mb di RAM privata.

La stessa cosa accade dopo aver percorso la stessa distanza ma andando avanti e indietro tra due punti ripetutamente.

Tuttavia, le mie letture mostrano che il programma sta chiamando correttamente glDeleteTextures circa un secondo dopo che le trame si spengono dallo schermo; e valgrind non sta riscontrando perdite.

Come faccio a sapere se dovrei essere preoccupato per questo, o se è solo una stranezza di come la memoria delle pagine del sistema operativo?


1
Come hai determinato l'utilizzo della RAM della tua applicazione? Stai usando un profiler (quale?) O ti fidi del task manager del tuo sistema operativo (quale)?
Philipp,

1
Task manager su kUbuntu, il profiler sul mio debugger mi dice che sta aspettando i dati e non mostra mai nulla.
Patrick Jeeves,

1
A proposito: quando controlli il consumo di memoria su Linux, ricorda di non guardare solo la memoria consumata dal processo di gioco. Una volta che ho lavorato su un gioco multipiattaforma ci siamo chiesti perché la versione di Windows consuma molta più RAM rispetto alla versione Linux, fino a quando abbiamo notato che la versione Linux della nostra API grafica apparentemente aveva allocato memoria per tutte le trame nel processo X11.
Philipp,

2
Non dovresti aspettarti che glDeleteTextures libererà effettivamente memoria: gamedev.stackexchange.com/questions/136883/…
Maximus

Risposte:


21

La memoria virtuale viene allocata dal sistema operativo in blocchi di grandi dimensioni, quando anche un byte è ancora in uso in quel blocco di grandi dimensioni non può essere rilasciato di nuovo nel sistema operativo.

Le librerie di allocazione nello spazio utente mantengono anche una certa quantità per il riutilizzo per evitare ripetutamente la richiesta e il rilascio di memoria da / verso il sistema operativo che è estremamente lento.

Ad esempio, allocare una trama, il driver OpenGL riserva una tabella di 32 slot trama, continui ad allocare trame, il driver deve quindi allocare una tabella più grande di 1024 slot trama questa nuova tabella ora occupa spazio nel grosso pezzo di RAM, tu liberando tutte le trame, il driver non si sta riducendo o riassegnando quella tabella nell'aspettativa che il tuo gioco / la tua applicazione dovranno usare più trame in seguito in modo che un grosso pezzo di RAM non possa essere rilasciato di nuovo sul sistema operativo.

Questo è perfettamente normale e voluto. La RAM non utilizzata verrà riutilizzata alla fine dalla tua app.


1
Vale la pena notare che se l'uso continua ad aumentare durante il gioco, ma i rilevatori di perdite continuano a non trovare nulla, potresti soffrire di un'eccessiva frammentazione della memoria. Gli approcci per risolvere un simile problema descritti su stackoverflow.com/questions/150753/… sarebbero utili anche per lo sviluppo del gioco.
Jules,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.