Pregunta

¿Tengo que limpiar todas las listas de pantallas, texturas, (geometría) sombreadores, etc. a mano a través de las funciones de GlDelete*, o el MEM de GPU se libera automáticamente cuando mi programa sale/se bloquea?

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

¿Fue útil?

Solución

Libere el contexto, todo lo demás es local para el contexto (a menos que haya habilitado el intercambio de listas de visualización) y desaparecerá junto con él.

Otros consejos

Como otros mencionaron, su sistema operativo (en colaboración con el administrador de recursos del controlador) debe divulgar los recursos. Para eso están los sistemas operativos. Vale la pena señalar que esto no tiene nada que ver con OpenGL, pero es algo que es parte de la carta de OSE bien comportados y sus conductores asociados. El sistema operativo está ahí para manejar todos los recursos del sistema. Los OpenGL son solo sino un subconjunto de ellos, y no son diferentes de, digamos un mango de archivo. Ahora para obtener más concreto, debe especificar qué sistema operativo le importa.

Por cierto, aquí es donde hago una excepción con la respuesta de Chrisf. No debe depender del conductor decidir que necesita hacer limpieza. Los modelos de controladores del sistema operativo tendrán una interfaz clara entre el controlador OpenGL en modo de usuario (que no debería realizar la asignación real de recursos GFX, ya que se comparte en la máquina), el sistema operativo (que proporciona el equivalente de llamadas del sistema para asignar recursos) y el Controlador de modo de kernel (que está simplemente allí para ejecutar las órdenes del sistema operativo de una manera compatible con la GPU). Este es al menos el caso con los modelos WIN2K y WDDM.

Entonces ... si su proceso se bloquea o termina de otra manera, en esos modelos, es responsabilidad del sistema operativo llamar al controlador de modo de núcleo para liberar todos los recursos que se asociaron con el proceso.

Ahora, ya sea tu debería O no es realmente algo que es un poco 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, renunciar de inmediato es una mejor experiencia de usuario final" frente a "quiero saber si estoy filtrando memoria porque si mi programa está de larga duración, realmente no quiero que presente errores OOM . La mejor manera de hacerlo es estar libre de fugas en todo "son las 2 líneas principales de pensamiento que conozco.

Cuando su programa sale (o se bloquea), cualquier recuerdo que haya asignado actualmente debe liberarse eventualmente 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 han implementado los controladores de la tarjeta gráfica. Es mucho mejor hacer llamadas de limpieza explícitas cuando usted (como programador) sabe que no necesitará esa memoria nuevamente.

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

En OpenGL, no hay memoria para almacenar la información de dibujo. Aquí, cuando ejecutamos el programa OpenGL, ese tiempo llamando al método de marco de dibujo llamando secuencialmente. De todos modos, si dibujamos una línea o un círculo de medios, cada vez que su método de marco de dibujo llamado para dibujar en el lugar especificado. BUT, OpenGL no almacena esa línea en la memoria. En cualquier momento, solo su dibujo. Pero, cuando vimos, esa línea está amanada con éxito.

Ej: en Android OpenGL ES2.0 utilizó esta clase de renderizador dentro del método de marco de dibujo (método de dibujo interno) para dibujar las líneas o círculos, etc. Utilicé este programa OpenGL ES2.0 en el desarrollo de aplicaciones de Android AutoCad. Si desea borrar el Las líneas amanecer utilizan este método en la clase de renderizador dentro del método OnDrawFrame 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);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top