2010-02-06 30 views
8

¿Debo limpiar todas las listas de visualización, texturas, sombreadores (de geometría) y demás a mano a través de las funciones glDelete *, o la mem de la GPU se libera automágicamente cuando mi programa se cierra/se bloquea?OpenGL GPU ¿Requiere limpieza de memoria?

Nota: La memoria de la GPU se refiere a la memoria dedicada en una tarjeta gráfica dedicada, no a la memoria de la CPU.

+0

Depende de su definición de "tener que". No "tienes que" hacer nada. Si quieres ser "correcto", sí; siempre debe liberar sus recursos cuando haya terminado. – GManNickG

+0

Prefiero saber si se limpiará automáticamente, * en breve * después de que se cierre el programa, o si la memoria de la GPU se pierde hasta el próximo reinicio. Esperaba que alguien pudiera indicarme la especificación OpenGL y se definió allí (aunque mi motor de búsqueda favorito no me escuchó nada útil). – drahnr

+0

Ambos! Realmente, limpia después de ti mismo, incluso si el sistema operativo lo hace por ti. No es necesario que "elimine" ninguna memoria nueva, el sistema operativo la liberará cuando termine el programa, pero eso no es algo que sugiera. –

Respuesta

13

Libere el contexto, todo lo demás es local al contexto (a menos que haya habilitado el uso compartido de listas de visualización) y se irá junto con él.

+0

¿Podría ayudarnos a comentar qué pasa si wglDeleteContext no libera toda la memoria? – SOUser

+0

@SOUser: ¿Habilita el uso compartido de recursos entre contextos? Luego, los recursos se liberarán cuando se elimine el último de los contextos vinculados. Si tiene pruebas de que eliminar el contexto no es una limpieza, presente un error con el controlador de la GPU. –

1

Cuando su programa se cierra (o se cuelga), entonces cualquier memoria que tenga asignada actualmente debe liberarse al final de la misma manera que la memoria principal generalmente se libera cuando sale un programa. Puede pasar algún tiempo antes de que la GPU "se dé cuenta" de que la memoria está disponible para su uso nuevamente.

Sin embargo, no debe confiar en este comportamiento, ya que puede depender de cómo se hayan implementado los controladores de la tarjeta gráfica. Es mucho mejor hacer llamadas explícitas de limpieza cuando (como programador) sabe que no necesitará esa memoria nuevamente.

1

Todos sus recursos de la GPU se liberarán cuando finalice su programa. Una manera fácil de probar es no eliminar cosas, y ejecutar su aplicación repetidamente para ver si falla las asignaciones después de algunas iteraciones.

8

Como han mencionado otros, su sistema operativo (en colaboración con el administrador de recursos del controlador) debería liberar los recursos. Para eso son los sistemas operativos. Vale la pena señalar que esto no tiene nada que ver con OpenGL, pero es algo que forma parte de la carta de sistemas operativos bien comportados y sus controladores asociados. El sistema operativo está allí para manejar todos los los recursos del sistema. Los OpenGL son solo un subconjunto de ellos, y no son diferentes de, digamos, un identificador de archivo. Ahora, para ser más concretos, debe especificar qué sistema operativo le interesa.

BTW, aquí es donde tomo la excepción con la respuesta de ChrisF. No debería depender del conductor decidir si necesita hacer la limpieza. Los modelos de controladores OS tendrán una interfaz clara entre el controlador OpenGL de modo de usuario (que no debe hacer la asignación real de recursos gfx, ya que se comparte en la máquina), el sistema operativo (que proporciona el equivalente de llamadas al sistema para asignar recursos) y el controlador kernel-mode (que simplemente está ahí para ejecutar las órdenes del sistema operativo de una manera compatible con el gpu). Este es al menos el caso con los modelos WIN2K y WDDM.

Entonces ... si su proceso falla o de lo contrario termina, en esos modelos, es responsabilidad del sistema operativo llamar al controlador kernel-mode para liberar todos los recursos que se asociaron con el proceso.

Ahora, si es o no, es realmente algo así como pedir pestañas o espacios en el código fuente. Diferentes personas tienen diferentes creencias aquí. "el sistema operativo lo hará de todos modos, salir de inmediato es una mejor experiencia para el usuario final" frente a "Quiero saber si estoy perdiendo memoria porque si mi programa es de larga ejecución, realmente no quiero que pegue errores OOM La mejor forma de hacerlo es estar libre de fugas en todo momento "son las dos líneas principales de pensamiento que conozco.

+0

Creo que tengo el "por qué" .. thx para su respuesta – drahnr

+0

Tenga en cuenta que usted se está contradiciendo. Sí, el sistema operativo envía un evento al controlador cuando se necesita una limpieza ... pero sigue siendo el controlador el que hace el trabajo real, y la falla de limpieza es la culpa de un controlador defectuoso. –

+0

@BenVoigt: intenté aclarar a qué me refería. ¿Eso está mejor? – Bahbar

-1

En Opengl, no hay memoria para almacenar la información de dibujo. aquí, cuando ejecutamos el programa opengl, esa vez llamamos al método draw frame llamando secuencialmente. De todos modos, si dibujamos una línea o un círculo significa que, en cualquier momento, su llamada atrae un método de marco para dibujar en un lugar específico, pero opengl no almacena esa línea en la memoria. En cualquier momento, solo su dibujo. pero, cuando lo vimos, esa línea se inició con éxito.

Ej: En Android Opengl es2.0 usó esta clase de renderizador dentro del método de dibujo (método de dibujo interno) para dibujar las líneas o círculos, etc. utilicé este Opengl es2.0 Program en el desarrollo de aplicaciones de autocad de Android .. si quiere borrar las líneas al amanecer use este método en la clase de renderizado dentro del método Drowframe GLES20.glClearColor (0.0f, 0.0f, 0.0f, 1.0f); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

+0

Bueno, por supuesto, no almacena ninguna geometría dibujada, pero almacena un montón de otras cosas, tanto en la CPU como en la memoria de la GPU. El mejor ejemplo, ¿dónde se dibuja esa línea y por qué puedes verla? –

+0

Hola Christian Rau, tienes razón. Dije sobre almacenamiento de memoria GPU solamente. Estoy enfrentando el problema mencionado anteriormente. Por favor, mira este enlace y, si es posible, ayúdame en esta lucha. http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices Consulte este código de ejemplo también desde este enlace http://tuxbalaji.wordpress.com/2013/06/ 19/draw-a-line-using-opengles2-0-by-touch-event-in-android / – harikrishnan

Cuestiones relacionadas