0

私はAppleのGLImageProcessingの例で働いています - 画像にさまざまなフィルタを適用します。私はGLImageProcessing Multiple Filters?の後ろに2つのフィルターで動作させるようにしました。OpenGL ES:FBO/Texture Leaksメモリ

アップルのオリジナルの例は素晴らしい作品で、メモリがリークしません。

上記の質問のコードを使用すると、10〜20秒でiPhoneのメモリがすべて消費され、メモリ警告が表示され、最終的にアプリがクラッシュします。

は、私はそれが(FBOさんを)バッファオブジェクトをaditionalテクスチャを作成し、フレームに関連しています知っているが、私は正しく(およびそのメモリ)を管理するかどうかはわかりません

コード:

void drawGL(int wide, int high, float contrastVal,float brightnessVal) 
{ 
    //INIT 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(0, wide, 0, high, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glScalef(wide, high, 1); 


    glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *)&SystemFBO); 


    // Create the texture and the FBO the will hold the result of applying the first filter 
    glGenTextures(1, &ResultTexture); 
    glBindTexture(GL_TEXTURE_2D, ResultTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wide, high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glGenFramebuffersOES(1, &ResultTextureFBO); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultTextureFBO); 
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, ResultTexture, 0); 


    glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultTextureFBO); 
    glBindTexture(GL_TEXTURE_2D, Input.texID); 

    glViewport(0, 0, wide, high); 
    brightness(flipquad, contrastVal); 
    glCheckError();; 


    glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO); 
    glBindTexture(GL_TEXTURE_2D, ResultTexture); 

    glViewport(0, 0, wide, high); 
    contrast(fullquad,brightnessVal); 
    glCheckError(); 
} 

これを行うより良い方法はありますか?

答えて

1

あなたがしていることはうまく見えますが、テクスチャやFBOを削除することは決してありません。電話する必要があります:

glDeleteTextures (1, ResultTexture); 
glDeleteBuffers (1, ResultTextureFBO); 

いつかは、使用するメモリを解放します。さもなければ、彼らは永遠にぶらぶらします。

1

私はまったく同じ問題を抱えていました。メモリ警告は、メソッドが呼び出されるたびにテクスチャを生成した結果と考えられます。

したがって、あなたの例のコードのinitGLメソッドに次の行を移動してみてください:

glGenTextures(1, &ResultTexture); 
glGenFramebuffersOES(1, &ResultTextureFBO); 
関連する問題