我的程序一次将大的jpeg渲染为一个纹理,并允许用户通过重新使用“相同”纹理在它们之间切换。
我一开始就调用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
每次都会释放内存?关于如何更好地实现这一点的任何想法?
ps这是遇到内存泄漏的屏幕(https://p.twimg.com/AoWVy8FCMAEK8q7.png:大)
最佳答案
由于要重复使用纹理,因此不应使用glDeleteTextures将其删除。如果这样做,则需要使用glGenTextures创建一个新纹理,而在loadTexture_Ipl函数中看不到您正在执行此操作。