2010-04-17 118 views
2

我有一個Android動態壁紙,我懷疑是內存泄漏,可能是紋理或頂點數組。我在我的紋理ID上調用glDeleteTextures,但沒有看到我的頂點緩衝區的任何類型的等價物。我希望能夠確保我的紋理和緩衝區都被OpenGL卸載,我錯過了什麼?卸載OpenGL中的頂點緩衝區

我發現的文檔似乎暗示OpenGL只是自己動手,但這並沒有給我很多的安慰。

回答

1

這不是簡單的glDeleteBuffers()

+0

我在GL10對象(靜態或實例)中看不到glDeleteBuffers,它看起來不是java.nio.byteBuffer的一部分。 – 2010-04-17 03:44:21

+0

它是OpenGL規範的一部分。它是否不包含在你的Java包裝中?它肯定會在C API中出現。 – 2010-04-19 20:15:43

3

頂點數組和頂點緩存是2件不同的東西,如果你確實使用頂點緩衝區對象(VBO)機制來提供頂點數據,GL是從你的問題不清楚,或者如果您使用客戶端陣列。

從GL的角度來看,VBO由GL所有,並且需要明確地分配/解除分配。這就是一隻流浪貓在說什麼。您使用glBufferData分配VBO的內存,然後使用glBufferData或通過刪除VBO對象本身來釋放內存。

現在,如果您不使用VBO,則GL將您傳遞的數據複製到中,每個數據分配,並且不會將源存儲器視爲其自身。在你的情況下,這意味着幾件事:

  • 源數據由客戶端刪除。由於您使用的是java,而java是一種垃圾收集語言,所以有可能是擺脫這種內存的唯一方法是java收集它。GL實現通常需要保留臨時數據副本(因爲在許多情況下,GPU不會立即在平局中工作)。這完全取決於GL的實施處理,而且您可能完全無法控制這一點。
0

採取的一點。目前我正在使用本地順序直接bytebuffer來處理所有事情,我認爲在使用時緩衝到OpenGL中,但也許我錯了。設置代碼如下所示:

ByteBuffer bufTCDirect; 
bufTCDirect = ByteBuffer.allocateDirect(aNumElements * 2 * (Float.SIZE >> 3)); 
bufTCDirect.order(ByteOrder.nativeOrder()); 

FloatBuffer bufTC; 
bufTC = bufTCDirect.asFloatBuffer(); 

bufTC.clear(); 
bufTC.put(tcArrayFromFile); // a float[] array loaded from the model file 
bufTC.position(0); 

後來,我做的,當我告訴卸載是這樣的:

this.bufTC = null; 
this.bufTCDirect = null; 

這聽起來我想這是正確的,因爲如果這些是客戶端垃圾收集器將從那裏照顧的東西?

0

在OpenGL中ES2或更新,保持緩衝器位置作爲一個字段中的類:

int buffers[] = new int[1]; 

生成在GPU上的緩衝器指針:

glGenBuffers(buffers.length, buffers, 0); 

創建頂點數組和裝載到GPU內存:

FloatBuffer vertexArray = ByteBuffer 
      .allocateDirect (4 * vertexData.length) // 4 bytes per float 
      .order (ByteOrder.nativeOrder ()) 
      .asFloatBuffer () 
      .put (vertexData); 

    glBufferData (GL_ARRAY_BUFFER, 
      4 * vertexArray.capacity (), // bytes per float again 
      vertexArray, 
      GL_STATIC_DRAW); 

完成後刪除緩衝區:

glDeleteBuffers (1 , buffers , 0);