2014-01-07 74 views

回答

11

OGL文檔說: 「glBufferData創建並初始化一個新的數據存儲區,任何綁定到目標緩衝區的預先存在的數據存儲區都將被刪除。 參見:http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml

因此,多次調用glBufferData時不會發生內存泄漏。 當然zero298是正確的,你必須調用glDeleteBuffer來最終釋放分配給目標的內存。

+0

澄清:這可能是許多glBufferData調用,稍後會有一個glDeleteBuffer調用 - 也許很多幀以後,甚至可能在應用程序退出前(取決於用戶的使用情況),在這種情況下會自動處理,所以可以省略。 – ToolmakerSteve

2

呼叫glDeleteBuffersglDeleteBuffers API

不過,我真的不建議頻繁更改緩衝區的大小。相反,如果您必須更改緩衝區中的數據,只需分配一個較大的緩衝區,將其包含您需要的數據,並記下您可以安全地在緩衝區中取消引用的內容,並僅使用這些緩衝區。

不斷分配和刪除一個OpenGL緩衝區很慢。我認爲這比緩衝數據要慢很多,因爲你必須從GPU到CPU的往返行程才能給你一個指向GPU緩衝區的新指針,然後你必須將數據發送回GPU, 那麼你必須發送另一個往返呼叫來刪除緩衝區。這3次旅行!

我的意思是,無論何時您使用C++分配數組,您是否每次填充數組或循環使用時,都會一直使用newdelete數組?

+2

出於同樣的原因,不斷改變正在用於暫掛'glDrawArrays(...)'命令的VBO中的數據也很慢。硬件加速的GL實現與CPU異步運行,並且繪圖命令趨於排隊。 GL必須在幕後引入一些同步,以防止在這些命令完成之前更改數據。但是,如果您更改遊戲,以便爲數據更新分配新內存,則不會爭用內存,也不需要進行昂貴的同步。 GL調用這個緩衝區失效/孤兒。 –

3

glBufferData (...)將創建一個新的數據存儲,以及任何命令中所使用的舊數據存儲的管道排隊是通過GL隱含保護。也就是說,在所有使用VBO舊數據的命令完成之前,GL不允許刪除舊的數據存儲。這是一個重要的概念,因爲它對於稱爲"buffer orphaning"的技術可能很有用,當您將VBO發送給新數據時,您可以重新分配VBO,以便在更新當前用於繪圖的VBO中的數據時減少GL的同步開銷。

沒有什麼會泄漏,並且在一些特殊情況下(例如,緩衝流),對於一個VBO的數據存儲,在使用中可以比更新它更有效的分配重新。在較新版本的GL中映射和使緩衝區範圍無效的能力大大緩解了這種優化策略,但它仍然值得思考。