需要OpenGL GPU内存清理吗?

问题描述 投票:8回答:5

我是否必须通过glDelete *函数手动清理所有DisplayLists,Textures,(Geometry-)着色器等,或者当我的程序退出/崩溃时GPU mem是否会自动释放?

注意:GPU mem是指专用显卡上的专用内存,而不是CPU内存。

opengl memory-management memory-leaks gpu
5个回答
14
投票

释放上下文,其他所有内容都是上下文本地的(除非您启用了显示列表共享)并将随之消失。


9
投票

正如其他人所提到的,您的操作系统(与驱动程序资源管理器合作)应该释放资源。这就是操作系统的用途。值得注意的是,这与OpenGL无关,但它是行为良好的操作系统及其相关驱动程序的一部分。操作系统可以处理所有系统资源。 OpenGL只是它们的一部分,它们与文件句柄没什么区别。现在要更具体,您应该指定您关心的操作系统。

顺便说一句,这是我对ChrisF的答案不以为然的地方。决定它需要进行清理不应该由驾驶员决定。操作系统驱动程序模型将在用户模式OpenGL驱动程序(不应该执行实际的gfx资源分配,因为它在机器中共享),操作系统(提供相当于系统调用以分配资源)和内核模式驱动程序(仅用于以与gpu兼容的方式执行OS命令)。这至少是WIN2K和WDDM型号的情况。

因此......如果您的进程崩溃或以其他方式终止,在这些模型中,操作系统负责调用内核模式驱动程序以释放与该进程关联的所有资源。

现在,无论你是否应该这样做,有点像在源代码中询问标签或空格。不同的人在这里有不同的信仰。 “操作系统无论如何都会这样做,立即退出是一种更好的最终用户体验”vs“我想知道我是否在泄漏内存,因为如果我的程序长时间运行,我真的不希望它出现OOM错误最好的方法是在整个过程中保持无泄漏“这是我所知道的两条主要思路。


1
投票

当程序退出(或崩溃)时,它当前分配的任何内存最终应该以与程序退出时通常释放主内存相同的方式释放。在GPU“意识到”存储器可再次使用之前可能还需要一段时间。

但是,您不应该依赖此行为,因为它可能取决于显卡驱动程序的实现方式。当你(作为程序员)知道你不再需要那个内存时,做出明确的清理调用要好得多。


0
投票

程序退出时,将释放所有GPU资源。一种简单的测试方法是不删除内容,并重复运行您的应用程序,以查看在几次迭代后它是否未通过分配。


-1
投票

在Opengl中,没有用于存储绘图信息的内存。在这里,当我们执行opengl程序时,那个时候调用draw frame方法按顺序调用。无论如何,如果我们绘制一条线或圆圈意味着,任何时候它的调用绘制框架方法都可以在指定的位置绘制。但是,opengl不会将该行存储在内存中。任何时候,它的绘图只。但是,当我们看到时,那条线已成功曙光。

例如:在Android中,Opengl es2.0在drawframe方法中使用了这个渲染器类(在draw方法中)来绘制线条或圆圈等。我在android autocad app开发中使用了这个Opengl es2.0程序..如果你想清除dawned行在onDrawframe方法GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f)中的renderer类中使用此方法; GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

© www.soinside.com 2019 - 2024. All rights reserved.