OpenGL Driver Monitor表示纹理正在迅速增加。如何找到泄漏?

时间:2013-11-27 17:44:23

标签: macos opengl graphics memory-leaks fbo

当我运行我的应用程序时,OpenGL驱动程序监视器表示纹理数量正在迅速增加 - 在30秒内纹理数量增加约45,000。

但我一直无法找到泄漏。我已经检测了每个glGen*()调用以打印出它返回的每个GL对象名称 - 但它们都小于50,因此显然glGen*()创建的GL对象不会被泄露。

这是一个庞大而复杂的应用程序,它在不同线程上的共享上下文中为多个FBO呈现多个着色器,因此将其简化为一个简单的测试用例是不切实际的。

除了glGen*()来电之外还应该检查哪些内容以确定泄漏的内容?

1 个答案:

答案 0 :(得分:3)

有趣的是,那些glGen* (...)函数。他们所做的只是返回特定类型对象的第一个未使用的名称,并保留名称,以便后续调用glGen* (...)也不会给出名称。

第一次绑定名称时,在OpenGL中创建实际纹理对象(实际上是所有对象)。也就是说,glBindTexture (GL_TEXTURE_2D, 1)是创建名称为 1 的纹理的实际函数。有趣的是,在许多实现(OpenGL 2.1或更早版本)中,即使未通过调用glGenTextures (...)glBindTexture (...)获取,也可以使用您想要的任意随机数。仍然为该名称创建一个纹理(如果尚未存在)。

底线是glGenTextures (...)不是创建纹理的东西,它只给你找到的第一个未使用的纹理名称。我会专注于跟踪对glBindTexture (...)的所有调用,而您可能会将未初始化的数据作为名称传递。

更新

正如datenwolf指出的那样,如果您使用的是3.2+核心上下文,则此行为不适用(必须使用从OpenGL 3.0开始的匹配glGen* (...)调用生成名称)。但是,OS X默认为您提供2.1实现。