可以不执行 glDeleteBuffers 和其他 OpenGL (3.3) 清理吗?
Is it OK NOT to do glDeleteBuffers and other OpenGL (3.3) cleanups?
我有时会忘记清理,担心它们的资源是否驻留在 GPU 内存中。
我使用的东西:着色器程序、顶点数组对象和缓冲区对象、纹理
所有 OpenGL 资源都应该在 OpenGL 上下文(准确地说是所有 shared 上下文)销毁时自动释放。所以实际上,只要您的应用程序不触发某些视频驱动程序错误,当关闭带有一些未发布对象的 OpenGL 上下文时,应该没有泄漏 GPU 内存的风险。
系统也会注意释放已关闭应用程序的所有资源,即使某些 OpenGL 上下文已忘记关闭。否则,如果 GPU 在应用程序崩溃时保持分配的资源,调试 3D 应用程序将是一场彻头彻尾的噩梦。
为了证明这个想法 - 只需编写一个简单的测试应用程序,分配大部分 GPU 内存 (textures/VBOs) 并通过外部工具跟踪内存使用情况。幸运的是,Windows 10 中的任务管理器得到了显着改进,并显示了详细的 GPU 内存统计信息。
然而,从设计的角度来看,容忍不完整 clean-ups 听起来像是一个坏主意,因为在其他渲染器代码中使用相同的发布过程会导致真正的问题。
您为 OpenGL 上下文创建的所有资源都与该上下文相关联(以及您与之共享资源的任何其他上下文)。如果您销毁该上下文,将释放与其关联的所有资源。
如果您在程序退出时不销毁上下文,那么 OS 将在您退出后进行清理。
话虽这么说,用完资源就销毁是养成的好习惯。
我有时会忘记清理,担心它们的资源是否驻留在 GPU 内存中。
我使用的东西:着色器程序、顶点数组对象和缓冲区对象、纹理
所有 OpenGL 资源都应该在 OpenGL 上下文(准确地说是所有 shared 上下文)销毁时自动释放。所以实际上,只要您的应用程序不触发某些视频驱动程序错误,当关闭带有一些未发布对象的 OpenGL 上下文时,应该没有泄漏 GPU 内存的风险。
系统也会注意释放已关闭应用程序的所有资源,即使某些 OpenGL 上下文已忘记关闭。否则,如果 GPU 在应用程序崩溃时保持分配的资源,调试 3D 应用程序将是一场彻头彻尾的噩梦。
为了证明这个想法 - 只需编写一个简单的测试应用程序,分配大部分 GPU 内存 (textures/VBOs) 并通过外部工具跟踪内存使用情况。幸运的是,Windows 10 中的任务管理器得到了显着改进,并显示了详细的 GPU 内存统计信息。
然而,从设计的角度来看,容忍不完整 clean-ups 听起来像是一个坏主意,因为在其他渲染器代码中使用相同的发布过程会导致真正的问题。
您为 OpenGL 上下文创建的所有资源都与该上下文相关联(以及您与之共享资源的任何其他上下文)。如果您销毁该上下文,将释放与其关联的所有资源。
如果您在程序退出时不销毁上下文,那么 OS 将在您退出后进行清理。
话虽这么说,用完资源就销毁是养成的好习惯。