我一直在注意到我的程序中存在一個小內存泄漏,並且我終於能夠找出問題所在。在draw-call中使用glDisable(GL_TEXTURE_2D)時發生內存泄漏
我在做什麼,通過調用這個函數抽出5個矩形屏幕:
bool OpenGlEntity::fillRect(SDL_Rect rect, float R, float G, float B, float A){
glPushMatrix();
glDisable(GL_TEXTURE_2D);
GLfloat vertices_position[] = {
(GLfloat)rect.x, (GLfloat)rect.y,
(GLfloat)(rect.x+rect.w), (GLfloat)rect.y,
(GLfloat)(rect.x+rect.w), (GLfloat)(rect.y+rect.h),
(GLfloat)rect.x, (GLfloat)(rect.y+rect.h),
};
glTranslatef(0, 0, 0);
//scale
glScalef(1,1,1);
//set color
glColor4f(R, G, B, A);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices_position);
glLockArraysEXT(0, 4);
glDrawArrays(GL_QUADS, 0, 4);
glUnlockArraysEXT();
glDisableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
//reset color
glColor4f(1.f, 1.f, 1.f, 1.f);
glPopMatrix();
return true;}
如果我從來沒有運行「glDisable(GL_TEXTURE_2D);」 (或「glEnable(GL_TEXTURE_2D);」)泄漏不會發生。爲什麼是這樣?
對我來說,它並沒有太多意義,但是我再也沒有那麼經歷過OpenGL渲染。
感謝您提供非常詳細的答案。內存泄漏每秒大約100-200kb,只要引起它的東西被吸引,似乎就不會停下來。 我不知道爲什麼會發生這樣的事情。它有助於向您展示我的紋理項目的渲染代碼? – Tallkotten
這是一個很好的問題,實際上......我注意到你根本沒有使用OpenGL的對象模型(並且使用過時的Compiled Vertex Arrays)。也就是說,不是使用頂點緩衝對象和頂點數組對象來永久存儲頂點數據和狀態,而是每幀發送新數據。我不得不懷疑,如果你是以同樣的方式加載紋理數據?順便說一句:如果你使用glScale/glTranslate,你實際上可以在這個函數中爲任何矩形重新使用一組頂點(一個正方形)。 –
是的,你設置紋理對象的代碼會很有幫助。 –