我在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