2012-05-22 27 views
5

Estoy trabajando en una aplicación OpenGL de C++ basada en Linux, que utiliza los controladores Nvidia 290.10 de 64 bits. Estoy tratando de reducir su huella de memoria ya que hace uso de bastantes datos en vivo.uso de pila libGL

He estado usando valgrind/macizo para analizar el uso del montón, y si bien me ayudó a optimizar varias cosas, ahora la mayor parte de la memoria de montón utilizada es asignada por libGL. No importa cómo establezca el umbral, macizo no me permite ver en detalle de dónde provienen esas asignaciones, solo que es libGL. En las horas punta, veo aproximadamente 250 MB asignados por libGL (de un uso total de montón de 900 MB). Tengo una cantidad similar de memoria en la tarjeta gráfica, como VBO y texturas (en su mayoría una gran textura 4096 * 4096).

Parece que una cantidad similar de memoria como la que cargo en la memoria GPU se asigna en el montón por libGL. Las asignaciones de libGL también alcanzan su máximo cuando el volumen de VBO alcanza su máximo. ¿Eso es normal? Pensé que uno de los beneficios de tener una gran cantidad de memoria GPU es que mantiene la memoria RAM libre?

+1

¿qué uso especificó para la VBO en 'glBufferData'? – KillianDS

+0

Para la mayor parte de los VBO, es GL_STATIC_DRAW. En un caso, es GL_STREAM_DRAW, pero el comportamiento es el mismo incluso si esta parte de la aplicación está deshabilitada. – pholz

+0

@KillianDS no importa, porque el uso es solo una pista, no obligatorio. Además, OpenGL debe mantener una copia por varias razones. – datenwolf

Respuesta

7

Lo que experimentas es perfectamente normal, porque una implementación de OpenGL debe guardar una copia de los datos en la memoria del sistema por varias razones.

En OpenGL no hay acceso exclusivo a la GPU, por lo que dependiendo de su uso, puede ser necesario intercambiar datos (o simplemente liberar algunos objetos de la memoria de la GPU). Además, las GPU pueden bloquearse y los controladores simplemente pueden restablecerlas sin que el usuario se dé cuenta. Esto también requiere una copia completa de todos los datos del buffer.

Y no se olvide que hay una gran diferencia entre dirección de asignación de espacio (el valor reportado por Valgrind) y actual utilización de la memoria.

+0

Gracias, sospeché que podría ser algo así. Ahora cuando se llena la memoria RAM, ¿es menos malo siempre que gran parte de las asignaciones provengan de libGL? – pholz

+2

pholz: Bueno, libGL es justo donde proviene el código que hace las asignaciones, pero la memoria es efectivamente asignada por el proceso que asignó los recursos de OpenGL. Y para el sistema no hay diferencia en el medio. Además, los sistemas operativos modernos no diferencian entre RAM y almacenamiento. Para ellos, solo hay "memoria" y la memoria RAM es solo otro nivel de caché. Vea este artículo para una muy buena introducción al uso de la memoria moderna https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf

Cuestiones relacionadas