我是否必须通过glDelete *函数手动清理所有DisplayLists,Textures,(Geometry-)着色器等,或者当我的程序退出/崩溃时GPU mem是否会自动释放?
注意:GPU mem是指专用显卡上的专用内存,而不是CPU内存。
答案 0 :(得分:14)
释放上下文,其他所有内容都是上下文本地的(除非您启用了显示列表共享)并随之消失。
答案 1 :(得分:9)
正如其他人提到的,您的操作系统(与驱动程序资源管理器合作)应该释放资源。这就是操作系统的用途。值得注意的是,这与OpenGL无关,但它是行为良好的操作系统及其相关驱动程序的一部分。操作系统可以处理所有系统资源。 OpenGL只是它们的一部分,它们与文件句柄没什么区别。现在为了更具体,你应该指定你关心的操作系统。
顺便说一下,这是我对ChrisF的答案不以为然的地方。决定它需要进行清理不应该由驾驶员决定。操作系统驱动程序模型将在用户模式OpenGL驱动程序(不应该执行实际的gfx资源分配,因为它在机器中共享),操作系统(提供相当于系统调用以分配资源)和内核模式驱动程序(仅用于以与gpu兼容的方式执行OS命令)。这至少是WIN2K和WDDM型号的情况。因此......如果您的进程崩溃或以其他方式终止,在这些模型中,操作系统负责调用内核模式驱动程序以释放与该进程关联的所有资源。
现在,无论是否,是否真的有点像在源代码中询问制表符或空格。不同的人在这里有不同的信仰。 “操作系统无论如何都会这样做,立即退出是一种更好的最终用户体验”vs“我想知道我是否在泄漏内存,因为如果我的程序长时间运行,我真的不希望它出现OOM错误最好的方法是在整个过程中保持无泄漏“这是我所知道的两条主要思路。
答案 2 :(得分:1)
当你的程序退出(或崩溃)时,它当前分配的任何内存最终应该以与程序退出时通常释放主内存相同的方式释放。 GPU可能需要一段时间才能“意识到”内存可以再次使用。
但是,您不应该依赖此行为,因为它可能取决于显卡驱动程序的实现方式。当你(作为程序员)知道你不再需要那个内存时,做出明确的清理调用要好得多。
答案 3 :(得分:0)
当您的程序退出时,您的所有GPU资源都将被释放。一种简单的测试方法是不删除内容,重复运行应用程序以查看在几次迭代后它是否通过分配失败。
答案 4 :(得分:-1)
在Opengl中,没有用于存储绘图信息的内存。在这里,当我们执行opengl程序时,那个时候调用draw frame方法按顺序调用。无论如何,如果我们绘制一条线或圆圈意味着,任何时候它的调用绘制框架方法都可以在指定的位置绘制。但是,opengl不会将该行存储在内存中。 任何时候,它只是绘图。但是,当我们看到时,那条线已经成功了。
例: 在Android Opengl中,es2.0在drawframe方法中使用了这个渲染器类(在draw方法中)来绘制直线或圆等。 我在android autocad app开发中使用了这个Opengl es2.0程序。 如果你想清除曙光线,请在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);