我正在编写代码以从NSView获取OpenGL纹理。代码主要是Apple示例代码。但是,我需要在C ++类中使用它,并且我在泄漏对象时遇到问题。
以下是代码的有趣部分:
GLuint CPlusPlusClass::openGLTexFromNSView(NSView* theView)
{
GLuint texName = 0x0;
@autoreleasepool // 1
{ // 1
NSBitmapImageRep* bitmap = [theView bitmapImageRepForCachingDisplayInRect:[theView visibleRect]];
int samplesPerPixel = 0;
[theView cacheDisplayInRect:[theView visibleRect] toBitmapImageRep:bitmap];
samplesPerPixel = (int)[bitmap samplesPerPixel];
glPixelStorei(GL_UNPACK_ROW_LENGTH, (int)([bitmap bytesPerRow]/samplesPerPixel));
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glGenTextures (1, &texName);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texName);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
if(![bitmap isPlanar] && (samplesPerPixel == 3 || samplesPerPixel == 4))
{
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0,
samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
(int)[bitmap pixelsWide], (int)[bitmap pixelsHigh],
0, samplesPerPixel == 4 ? GL_RGBA : GL_RGB,
GL_UNSIGNED_BYTE, [bitmap bitmapData]);
}
} // 1
return texName;
}
当我将视图绘制到OpenGL上下文并在Activity Monitor中检查应用程序的内存占用时,每次Activity Monitor的视图刷新时,我都会看到该数字增加了大约4 MB。通过在代码中添加@autoreleasepool
指示的//1
块,我可以将其降低到每个刷新周期大约2 MB。不过,它还在不断增加。
从C ++中释放自动释放对象的正确方法是什么?
答案 0 :(得分:4)
不是C++
,而是Objective-C++
。
间接回答了这个问题;您可以像在Objective-C中一样管理Objective-C ++中的Objective-C对象。
对于手动线程,您需要手动管理自动释放池。确保在第一次调用线程中的Objective-C之前存在一个池,并确保在线程退出之前将其耗尽。如果线程存在很长时间,那么您将需要定期创建和释放自动释放池(就像它们在自动运行循环中一样)。
答案 1 :(得分:0)
事实证明,我对@autoreleasepool
所做的事情是完全正确的。
上面概述的功能我被称为每秒约50-60次。
我发现增加的内存负载是由glGenTextures
的重复调用产生的。它应该存储在变量中,而不是每次都被覆盖。
我没有考虑到这方面存在问题。 以为是自动释放池相关...