代码之家  ›  专栏  ›  技术社区  ›  drahnr

OpenGL GPU内存清理,需要吗?

  •  8
  • drahnr  · 技术社区  · 14 年前

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

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

    5 回复  |  直到 6 年前
        1
  •  14
  •   Ben Voigt    14 年前

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

        2
  •  9
  •   Bahbar    6 年前

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

    顺便说一句,这是我对克里斯夫的回答持异议的地方。驾驶员不应该决定是否需要进行清理。操作系统驱动程序模型将在用户模式OpenGL驱动程序(不应该进行实际的gfx资源分配,因为它在计算机中是共享的)、操作系统(提供等同于系统调用以分配资源)和内核模式驱动程序(仅在那里以与兼容的方式执行操作系统命令)之间有一个清晰的接口。GPU)。对于win2k和wddm模型来说,至少是这样。

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

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

        3
  •  1
  •   ChrisF    14 年前

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

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

        4
  •  0
  •   Alan    14 年前

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

        5
  •  -1
  •   harikrishnan    11 年前

    在OpenGL中,没有存储绘图信息的内存。在这里,当我们执行OpenGL程序时,这一次调用draw frame方法,并按顺序调用。不管怎样,如果我们画一条线或一个圆的意思是,任何时候它调用的画框方法都可以在指定的地方画图。但是,OpenGL不会将这条线存储在内存中。 任何时候都只能画。但是,当我们看到这条线时,它已经成功地出现了。

    前任: 在android opengl es2.0中,使用drawframe方法(inside 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);