2012-08-27 42 views
0

我一個2D遊戲,有可以加載,多層次的工作(而且應該被卸載。)的OpenGL glDeleteTextures C/C++

爲了更容易處理的紋理我寫了,有一個TextureLoader類一個包含所有紋理的列表,當遊戲中的某個對象想要使用紋理時,它只有通向它希望使用的紋理的路徑,然後詢問TextureLoader是否可以獲取具有相同路徑的紋理指針。然後,如果紋理不存在於列表中,則TextureLoader將在返回指針之前嘗試加載它。

這在整個遊戲中都可以正常工作,當我重新加載一個關卡時,內存使用保持不變。

但是,當我加載一個新的水平,我顯然希望卸載前一級,但它似乎並沒有工作。 。

這就是glDeleteTextures進來

所以我嘗試做的是:

int arraySize = textures.size(); 
GLuint* arr = new GLuint[arraySize]; 
int x = 0; 
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it) 
{ 
    arr[x] = (*it)->getImage(); 
    x++; 
} 
glDeleteTextures(arraySize, arr); 

textures.clear(); 

由於指針指向內存存儲在一個單獨的Texture2D類我嘗試之前收集所有的人調用glDeleteTextures;

但是,我的內存使用量在每個級別都在持續增長,直到達到堆棧溢出。

getImage() 

返回一個GLuint,它帶有一個指向我在第一次綁定紋理時獲得的紋理的指針。

我在做什麼錯?

+0

如果你單獨創建了所有的紋理ID,我不認爲數組刪除會起作用 - 但我可能在這裏是錯誤的。另外,請確保在調用delete時紋理未被綁定。綁定的紋理不會釋放。 –

+0

至於堆棧溢出,你可能會發佈一個調用堆棧。 – Pete

+0

我不知道如何解除紋理,我試過glDisable(GL_TEXTURE_2D),但它沒有幫助。如果我無法刪除單獨刪除的ID,我該如何解決該問題? – Orujimaru

回答

1

您不會遞增'x'。

此外,你泄漏數組的內存。爲什麼不使用矢量?

std::vector<GLuint> arr; 
arr.reserve(textures.size()); 
for (std::list<Texture2D*>::iterator it = textures.begin(); it != textures.end(); ++it) 
{ 
    arr.push_back((*it)->getImage()); 

    // Are you missing: 
    // delete *it; 
} 
if (!arr.empty()) { 
    glDeleteTextures(arr.size(), &arr[0]); 
} 
textures.clear(); 
+0

謝謝,但恐怕不增加x只是一個錯字。 我試過你的解決方案,它不工作,也許getImage()不會返回正確的路徑到內存? – Orujimaru

+0

也許會添加一些調試代碼來驗證已創建的紋理ID以及您正在銷燬的ID。 – Pete

+0

這個id是指向內存的指針,對吧?所以只要我可以在遊戲中使用圖像,它應該是正確的值。但是,它是否必須是常量,因爲glDeleteTexture要求const值? – Orujimaru

0

監視我的顯存的使用情況後,我可以看到VRAM被正確釋放,所以這個問題是因爲在系統RAM的OpenGL存儲副本沒有得到釋放,當我打電話glDeleteTextures()。