2012-08-28 76 views
2

我創建的紋理是這樣的:SDL不釋放系統內存

//Create temp SDL_Surface 
SDL_Surface* surface = IMG_Load(this->path.c_str()); 

//If we successfully loaded an image 
if (surface) 
{ 
    SDL_DisplayFormatAlpha(surface); 

    bounds = GameRectangle(surface->w, surface->h); 

    GLuint object(0); 

    glGenTextures(1, &object); 

    glBindTexture(GL_TEXTURE_2D, object); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels); 

    SDL_FreeSurface(surface); 

    return object; 
} 

glDeleteTextures()釋放的VRAM正常,但系統RAM保持並建立直到遊戲崩潰。

我將它定位到SDL_Surface,顯然表面存儲器沒有被釋放。

任何想法?

+0

這是作業的OS釋放內存,所以解決方案可能是操作系統特定的 –

+0

我正在使用Windows 7專業64位,SP1 – Orujimaru

+0

你如何測量內存使用情況?請記住,只查看任務列表可能會給你錯誤的結果 - SDL 釋放內存完全可行,只是沒有將其交給系統(這可能非常困難)。這意味着您不會看到任務列表內存使用量減少,但內存仍可供應用程序重用。 –

回答

2

這與OpenGL無關。

您對SDL_DisplayFormatAlpha的調用返回一個新的SDL_Surface,以便您的原始曲面仍然被分配。這意味着您將泄漏每個圖像的副本。

你應該這樣做:

SDL_Surface* surfaceWithAlpha = SDL_DisplayFormatAlpha(surface); 
SDL_FreeSurface(surface); 
...rest of code use surfaceWithAlpha 
SDL_FreeSurface(surfaceWithAlpha); 

documentation

+0

啊,很好的電話,它現在完美。它甚至將使用的RAM從300mb減少到30mb。 謝謝! – Orujimaru

+0

我想補充說,它以某種方式出乎意料地工作。 如果我使用surfaceWithAlpha代碼的其餘部分,顏色會失真。所以然後我嘗試刪除SDL_DisplayFormatAlpha(表面),它爲兩個第一級別工作正常,但後來在沒有錯誤給出的第三級別崩潰。所以我保留了SDL_DisplayFormatAlpha(surface),並在其下方添加了SDL_FreeSurface(surfaceWithAlpha),現在它完美地工作。 – Orujimaru

1

我一開始並沒有注意到一個解決方法就足夠了。

然後,調用glTexImage2D,提供等於0的紋理大小應強制OpenGL釋放內存。你可以刪除它。如果它不起作用,泄漏就出現在你的代碼中。

+0

謝謝,你建議我在哪裏調用glTextImage2D,哪個值是紋理大小?現在我在綁定紋理之後調用它: glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surface-> w,surface-> h,0,GL_RGBA,GL_UNSIGNED_BYTE,surface-> pixels); – Orujimaru

+0

http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml所以我相信它會像'(GL_TEXTURE_2D,0,任何東西,0,0,0,任何東西,0) ' –

+0

glTexImage似乎不會將副本導入RAM,因爲如果我將代碼更改爲您的示例,則所有紋理都會消失,但內存使用量仍會增加。請看看我添加到原始問題的代碼片段。 – Orujimaru