¿Cómo sé si la memoria no se maneja correctamente?

12

La huella de memoria de mi juego (2D) parece aumentar cada vez que cargo una textura, por ejemplo, cuando inicio mi juego usa 30 mb de RAM privada, después de atravesar un archivo de fondo de ~ 367 mb, por lo que todo está en RAM en algún momento, aumenta a 54 mb de RAM privada.

Lo mismo sucede después de recorrer la misma distancia pero yendo y viniendo entre dos puntos repetidamente.

Sin embargo, mis lecturas muestran que el programa está llamando correctamente a glDeleteTextures aproximadamente un segundo después de que las texturas desaparecen de la pantalla; y valgrind no encuentra ninguna fuga.

¿Cómo sé si debería preocuparme por esto, o si es solo una peculiaridad de cómo funciona la memoria del sistema operativo?

Patrick Jeeves
fuente
1
¿Cómo determinó el uso de RAM de su aplicación? ¿Está utilizando un generador de perfiles (¿cuál?) O simplemente confía en el administrador de tareas de su sistema operativo (¿cuál)?
Philipp
1
Administrador de tareas en kUbuntu, el generador de perfiles en mi depurador me dice que está esperando datos y nunca muestra nada.
Patrick Jeeves
1
Por cierto: cuando verificas el consumo de memoria en Linux, recuerda no solo mirar la memoria consumida por el proceso del juego. Una vez que trabajé en un juego multiplataforma, nos preguntamos por qué la versión de Windows consume mucho más RAM que la versión de Linux, hasta que notamos que la versión de Linux de nuestra API de gráficos aparentemente asignó memoria para todas las texturas en el proceso X11.
Philipp
2
No debe esperar que glDeleteTextures realmente libere memoria: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Respuestas:

21

La memoria virtual se asigna desde el sistema operativo en grandes fragmentos, cuando incluso un byte se deja en uso en ese gran fragmento, no se puede volver a liberar en el sistema operativo.

Las bibliotecas de asignación en el espacio del usuario también mantienen una cierta cantidad de reutilización para evitar exigir y liberar repetidamente memoria desde / hacia el sistema operativo, que es extremadamente lenta.

Por ejemplo, asigna una textura, el controlador OpenGL reserva una tabla de 32 ranuras de textura, sigue asignando texturas, el controlador necesita asignar una tabla más grande de 1024 ranuras de textura, esta nueva tabla ahora está ocupando espacio en la gran porción de RAM, usted libera todas las texturas, el controlador no se está reduciendo ni reasignando esa tabla con la expectativa de que su juego / aplicación necesitará usar tantas texturas más tarde para que no se pueda liberar una gran cantidad de RAM en el sistema operativo.

Esto es perfectamente normal y deseado. La RAM no utilizada será reutilizada eventualmente por su aplicación.

Stephane Hockenhull
fuente
1
Vale la pena señalar que si el uso continúa aumentando durante la reproducción, pero los detectores de fugas aún no encuentran nada, es posible que sufra una fragmentación excesiva de la memoria. Los enfoques para resolver dicho problema descritos en stackoverflow.com/questions/150753/… también serían útiles para el desarrollo del juego.
Jules