2012-03-19 341 views
1

我的程序一次渲染一個大的jpeg作爲紋理,並允許用戶通過重新使用「相同」紋理在它們之間切換。導致內存泄漏的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 *調用在傳遞給它的指針上覆制內存,通常將它存儲在特殊的圖形內存中。使用glDeleteTextures時,原始內存塊不會被刪除。我不知道這是否是你的問題,因爲你的問題並不清楚。 – 2012-03-19 12:23:52

+0

感謝您的幫助。我如何取消分配原始內存? – Awalias 2012-03-19 12:34:17

+0

@ Zyx2000當然,它可以釋放內存。它還能做什麼?閱讀[這裏](http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml) – 2012-03-19 13:00:30

回答

4

既然你想重用你的紋理,你不應該用glDeleteTextures刪除它。如果你這樣做,你需要使用glGenTextures創建一個新的紋理,我沒有看到你在loadTexture_Ipl函數中這樣做。

+0

我從閱讀這個功能後刪除它... http://stackoverflow.com/a/5658096/1267728 – Awalias 2012-03-19 14:28:56

+1

@AntWilson:但你沒有刪除與它匹配的'glDeleteTextures'。 'glGenTextures'創建紋理名稱。 'glDeleteTextures'將其刪除。他們是成對的,比如'new'和'delete'。如果你有新東西,你只能'刪除它*一次*。 – 2012-03-19 22:28:06

+0

這是有很多紋理的情況。 – lvella 2012-03-19 22:29:00