1

現在、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 コンテキストに描画し、アクティビティ モニターでアプリのメモリ フットプリントを確認すると、アクティビティ モニターのビューが更新されるたびに、数値が約 4 MB 増加することがわかります。@autoreleasepoolコードに で示されているブロックを追加すること//1で、更新サイクルごとに約 2 MB に減らすことができました。それでも、どんどん増えていきます。

自動解放されたオブジェクトを C++ から解放する正しい方法は何ですか?

4

2 に答える 2

4

そうではありませC++Objective-C++

これは間接的に質問に答えます。Objective-C++ で Objective-C オブジェクトを管理するのは、Objective-C とまったく同じです。

手巻きスレッドの場合、自動解放プールを手動で管理する必要があります。スレッドでの Objective-C への最初の呼び出しの前にプールが配置されていることを確認し、スレッドの終了の直前にそれが排出されることを確認します。スレッドの寿命が長い場合は、自動解放プールを定期的に作成して排出する必要があります (実行ループが自動的に実行されるように)。

于 2013-08-19T16:54:23.913 に答える
0

@autoreleasepool私が で行っていたことが完全に正しいことが判明しました。

上で概要を説明した関数は、1 秒あたり約 50 ~ 60 回呼び出されます。メモリ負荷の増加は、 の繰り返し呼び出しによって発生することがわかりましたglGenTextures。代わりに変数に格納し、毎回上書きしないようにする必要があります。

その点で問題があるとは考えていませんでした。自動解放プール関連だと思った...

于 2013-08-19T19:01:25.780 に答える