9

我是否必须通过 glDelete* 函数手动清理所有显示列表、纹理、(几何-)着色器等,或者当我的程序退出/崩溃时 GPU 内存是否会自动释放?

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

4

5 回答 5

16

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

于 2010-02-15T04:12:16.897 回答
11

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

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

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

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

于 2010-02-07T09:50:05.323 回答
2

当你的程序退出(或崩溃)时,它当前分配的任何内存最终都应该被释放,就像程序退出时通常释放主内存一样。GPU 可能需要一段时间才能“意识到”内存可以再次使用。

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

于 2010-02-06T23:09:42.303 回答
0

当您的程序退出时,您的所有 GPU 资源将被释放。一个简单的测试方法是不删除任何东西,然后反复运行你的应用程序,看看它是否在几次迭代后分配失败。

于 2010-02-07T05:02:06.763 回答
-1

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

例如:在 Android Opengl es2.0 中,在 drawframe 方法(内部 draw 方法)中使用了这个渲染器类来绘制线条或圆等。我在 android autocad 应用程序开发中使用了这个 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);

于 2013-06-21T07:05:18.197 回答