我有一個Android動態壁紙,我懷疑是內存泄漏,可能是紋理或頂點數組。我在我的紋理ID上調用glDeleteTextures,但沒有看到我的頂點緩衝區的任何類型的等價物。我希望能夠確保我的紋理和緩衝區都被OpenGL卸載,我錯過了什麼?卸載OpenGL中的頂點緩衝區
我發現的文檔似乎暗示OpenGL只是自己動手,但這並沒有給我很多的安慰。
我有一個Android動態壁紙,我懷疑是內存泄漏,可能是紋理或頂點數組。我在我的紋理ID上調用glDeleteTextures,但沒有看到我的頂點緩衝區的任何類型的等價物。我希望能夠確保我的紋理和緩衝區都被OpenGL卸載,我錯過了什麼?卸載OpenGL中的頂點緩衝區
我發現的文檔似乎暗示OpenGL只是自己動手,但這並沒有給我很多的安慰。
這不是簡單的glDeleteBuffers()
?
頂點數組和頂點緩存是2件不同的東西,如果你確實使用頂點緩衝區對象(VBO)機制來提供頂點數據,GL是從你的問題不清楚,或者如果您使用客戶端陣列。
從GL的角度來看,VBO由GL所有,並且需要明確地分配/解除分配。這就是一隻流浪貓在說什麼。您使用glBufferData分配VBO的內存,然後使用glBufferData或通過刪除VBO對象本身來釋放內存。
現在,如果您不使用VBO,則GL將您傳遞的數據複製到中,每個數據分配,並且不會將源存儲器視爲其自身。在你的情況下,這意味着幾件事:
採取的一點。目前我正在使用本地順序直接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;
這聽起來我想這是正確的,因爲如果這些是客戶端垃圾收集器將從那裏照顧的東西?
在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);
我在GL10對象(靜態或實例)中看不到glDeleteBuffers,它看起來不是java.nio.byteBuffer的一部分。 – 2010-04-17 03:44:21
它是OpenGL規範的一部分。它是否不包含在你的Java包裝中?它肯定會在C API中出現。 – 2010-04-19 20:15:43