2012-03-19 74 views
1

我的程序一次渲染一个大的jpeg作为纹理,并允许用户通过重新使用“相同”纹理在它们之间切换。导致内存泄漏的OpenGL glDeleteTextures?

我在开始时拨打glGenTextures(1, &texture);一次。

然后我想交换的图像,每次我用:

FreeTexture(texture); 
ROI_img = fetch_image(temp, sortVector[tPiece]); 

loadTexture_Ipl(ROI_img , &texture); 

这里有被称为两个功能:

int loadTexture_Ipl(IplImage *image, GLuint *text) 
{ 
    if (image==NULL) return -1; 
    glBindTexture(GL_TEXTURE_2D, *text); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROI_WIDTH, ROI_HEIGHT,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData); 
    return 0; 
} 

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 

我的问题是,后一对夫妇的图像,他们停止渲染(纹理全是黑色)。如果我一直在尝试切换我收到此错误信息:

test(55248,0xacdf22c0) malloc: *** mmap(size=744001536) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Mar 19 11:57:51 Ants-MacBook-Pro.local test[55248] <Error>: CGSImageDataLock: Cannot allocate memory 

我认为glDeleteTextures将每次释放内存?

关于如何更好地实现这一点的任何想法?

p.s.这里是遇到内存泄漏的屏幕(https://p.twimg.com/AoWVy8FCMAEK8q7.png:large)

+1

glTexImage *调用在传递给它的指针上复制内存,通常将它存储在特殊的图形内存中。使用glDeleteTextures时,原始内存块不会被删除。我不知道这是否是你的问题,因为你的问题并不清楚。 – 2012-03-19 12:23:52

+0

感谢您的帮助。我如何取消分配原始内存? – Awalias 2012-03-19 12:34:17

+0

@ Zyx2000当然,它可以释放内存。它还能做什么?阅读[这里](http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml) – 2012-03-19 13:00:30

回答

4

既然你想重用你的纹理,你不应该用glDeleteTextures删除它。如果你这样做,你需要使用glGenTextures创建一个新的纹理,我没有看到你在loadTexture_Ipl函数中这样做。

+0

我从阅读这个功能后删除它... http://stackoverflow.com/a/5658096/1267728 – Awalias 2012-03-19 14:28:56

+1

@AntWilson:但你没有删除与它匹配的'glDeleteTextures'。 'glGenTextures'创建纹理名称。 'glDeleteTextures'将其删除。他们是成对的,比如'new'和'delete'。如果你有新东西,你只能'删除它*一次*。 – 2012-03-19 22:28:06

+0

这是有很多纹理的情况。 – lvella 2012-03-19 22:29:00