2012-03-19 65 views
1

私のプログラムは、大規模なjpegを一度に1つのテクスチャとしてレンダリングし、ユーザーは「同じ」テクスチャを再利用することでそれらを切り替えることができます。OpenGL glDeleteTexturesはメモリリークを引き起こしますか?

私はglGenTextures(1, &texture);を最初に呼び出します。

は、その後、私は私が使う画像交換するたびに:ここ

FreeTexture(texture); 
ROI_img = fetch_image(temp, sortVector[tPiece]); 

loadTexture_Ipl(ROI_img , &texture); 

が呼び出されている二つの機能は以下のとおりです。

int loadTexture_Ipl(IplImage *image, GLuint *text) 
{ 
    if (image==NULL) return -1; 
    glBindTexture(GL_TEXTURE_2D, *text); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROI_WIDTH, ROI_HEIGHT,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData); 
    return 0; 
} 

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 

私の問題は、画像のカップルの後、彼らはレンダリングを停止するということです(テクスチャはすべて黒です)。私は切り替えるように努力を続けるならば、私は、このエラーメッセージが表示されます:

test(55248,0xacdf22c0) malloc: *** mmap(size=744001536) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Mar 19 11:57:51 Ants-MacBook-Pro.local test[55248] <Error>: CGSImageDataLock: Cannot allocate memory 

私はglDeleteTexturesがメモリを毎回解放するだろうと思いました?

これをよりうまく実装するためのアイデアはありますか?

p.s.メモリリークが発生しました(https://p.twimg.com/AoWVy8FCMAEK8q7.png:large)

+1

glTexImage *は、渡されたポインタのメモリをCOPYします。通常、特別なグラフィックメモリに格納します。 glDeleteTexturesを使用している場合、元のメモリは削除されません。私はこれがあなたの問題であるかどうかはわかりません。あなたの質問からはっきりしていないからです。 –

+0

助けてくれてありがとう。元のメモリをどのように割り当て解除できますか? – Awalias

+0

@ Zyx2000もちろん、メモリを解放します。それ以外に何がありますか? [here](http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml)を参照してください。 –

答えて

4

テクスチャを再利用したいので、glDeleteTexturesで削除しないでください。その場合、glGenTexturesを使用して新しいテクスチャを作成する必要があり、loadTexture_Ipl関数でそれを行っているとは思われません。

+0

これを読んだ後に関数から削除しました... http://stackoverflow.com/a/5658096/1267728 – Awalias

+1

@AntWilson:しかし、あなたはそれに一致する 'glDeleteTextures'を削除しませんでした。 'glGenTextures'はテクスチャ名を作成します。 'glDeleteTextures'はそれを削除します。それらは 'new'や' delete'のようにペアです。あなたが '新しい'何かをした場合、あなたはそれを単に削除することができます* once *。 –

+0

多くのテクスチャがある場合です。 – lvella

関連する問題