NSImage和NSBitmapImageRep内存泄漏
NSImage and NSBitmapImageRep Memory Leak
我在C++应用程序中使用目标C在OSX上加载图像。它是一个OpenGL应用程序。这是我用来将图像加载到opengl的代码:
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;
}
多亏了Instruments,每次调用此函数时我都检测到内存泄漏。仪器公司表示,[NSImage TIFFRepresentation]
和[NSBitmapImageRep bitmapData]
正在消耗大量内存。
它不会失控,但每次调用此函数时,内存使用量都会攀升几百KB。
我在objective-c方面的经验有限,所以我不知道如何解决这个问题,因为我认为release
会很好地工作。
只是为了让你知道OpenGL纹理稍后会被释放,我已经确认它不是内存泄漏的来源。
编辑:经过进一步的测试,我发现理论上这不是内存泄漏,因为Instruments没有报告"内存泄漏"。但无论何时调用此函数,应用程序的内存使用率都会上升,而不会下降。当加载游戏中的场景时会调用此函数,因此每当加载场景时,内存使用量就会增加几兆字节。这怎么可能发生。我确信是这个函数耗尽了所有的内存。
首先:代码看起来并没有泄漏。我的猜测是,NSImage正在内部进行一些无害的缓存,以确保如果您第二次加载此图像文件,它可以重复使用相同的NSImage,这可能就是您所看到的。或者可能是文件系统缓存。如果内存紧张,这些缓存可能会被刷新,释放的内存将可用于应用程序。
也就是说,您的代码似乎过于复杂。您创建一个NSImage(由NSImageRep组成,其中一个很可能是NSBitmapImageRep),然后获得其TIFFRepresentation(即将所有数据重新编码为TIFF,可能会再次压缩),然后从中创建NSBitmapImage Rep(再次解压缩和解码TIFF),然后获取其位图数据。
至少,您应该从该文件创建一个NSData,并从中创建您的NSBitmapImageRep。这将跳过整个NSImage创建和TIFF步骤。
如果你只是去使用较低级别的ImageIO库,可能会更好。从文件中创建一个CGImageRef,然后将图像的原始解压缩数据交给OpenGL。我模糊地记得,如果你浏览CIImage或CoreVideo,甚至可能有更好的方法来创建OpenGL纹理,但我可能会把它与相反的方法混合在一起(纹理到CIImage)。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存