我的程序一次渲染一个大的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)
glTexImage *调用在传递给它的指针上复制内存,通常将它存储在特殊的图形内存中。使用glDeleteTextures时,原始内存块不会被删除。我不知道这是否是你的问题,因为你的问题并不清楚。 – 2012-03-19 12:23:52
感谢您的帮助。我如何取消分配原始内存? – Awalias 2012-03-19 12:34:17
@ Zyx2000当然,它可以释放内存。它还能做什么?阅读[这里](http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml) – 2012-03-19 13:00:30