我在C++应用程序中使用目标C在OSX上加载图像。这是一个OpenGL应用程序。这是我使用的图像加载到OpenGL的代码:NSImage和NSBitmapImageRep内存泄漏
bool OSXSpecifics::loadPNGOSX(const char *fileName, int &outWidth, int &outHeight, GLuint *outTexture) {
NSImage *image = [[NSImage alloc] initWithContentsOfFile:[NSString stringWithUTF8String: fileName]];
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
NSArray* imageReps = [image representations];
bool hasAlpha;
for (NSImageRep *imageRep in imageReps) {
if ([imageRep pixelsHigh] > outHeight) {
outHeight = [imageRep pixelsHigh];
}
if ([imageRep pixelsWide] > outWidth) {
outWidth = [imageRep pixelsWide];
}
}
if ([bitmap hasAlpha] == YES) {
hasAlpha = true;
} else {
hasAlpha = false;
}
glGenTextures(1, outTexture);
glBindTexture(GL_TEXTURE_2D, *outTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? 4 : 3, outWidth, outHeight, 0,
hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, [bitmap bitmapData]);
[bitmap release];
[image release];
return true;
}
由于仪器我已经检测到存储器泄漏每调用该函数的时间。仪器说[NSImage TIFFRepresentation]
和[NSBitmapImageRep bitmapData]
正在使用大量的内存。
它不会失去控制,但每次调用这个函数时,内存使用量都会上升几百千字节。
我对objective-c的使用经验有限,所以我不知道如何解决这个问题,因为我认为release
可以正常工作。
只是让你知道OpenGL纹理在稍后的时间点被释放,并且我已经证实它不是内存泄漏的来源。
编辑:经过一些进一步的测试,我发现这不是理论上的内存泄漏,因为乐器不报告“内存泄漏”。但是,无论何时调用此函数,应用程序的内存使用量都会上升,永远不会下降。当游戏中的场景被加载时,这个函数被调用,所以每当一个场景被加载时,内存使用量就会增加几兆字节。这怎么可能发生。我确定这是使用所有内存的功能。
感谢您的建议,我现在使用SOIL图像库,它的工作原理 – Constan7ine