2012-05-26 31 views
3

我在iOS/Android遊戲中遇到了一些性能問題,其中幾個VBO必須每隔一段時間更新一次。在分析我的遊戲後,事實證明glDeleteBuffers()每VBO更新需要長達7ms。當幀通常只需要4 ms渲染時,這當然會導致打嗝。glDeleteBuffers比glBufferData慢

這裏就是更新我的VBO部分:

Chunk* chunk; 
pthread_join(constructionThread, (void**)&chunk); 
building = false; 

if (vboID) 
{ 
    //takes 7 milliseconds 
    glDeleteBuffers(1, &vboID); 
    vboID = 0; 
} 
if (offset) 
{ 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 

    //takes about 1-2 milliseconds, which is acceptable 
    glBufferData(GL_ARRAY_BUFFER, offset * 4, constructionBuffer, GL_STATIC_DRAW); 
} 

其中offset是一個實例變量基本上是新的VBO,這是相當變量的大小。我猜是vBID自己說的;)

+0

爲什麼要刪除它們,如果你只是想重新創建它們? – harold

+1

,因爲它們會變成不同的尺寸。我認爲它們是普通數組。 – Brammie

回答

6

glGenBuffersglDeleteBuffers被設計成分別只在初始化和清理上運行。在運行時調用它們是不好的。

glBufferData用一組新數據替換當前緩衝區數據,這些數據會自動更改緩衝區的大小。你可以安全地刪除整個glGenBuffers/glDeleteBuffers的東西,並將其移動到初始化和清理。

此外,您正在創建緩衝區作爲靜態緩衝區。這告訴OpenGL你幾乎不會改變它,所以它以一種更快的方式存儲在GPU上,但是從系統的其餘部分訪問速度較慢。嘗試更改GL_STATIC_DRAWGL_DYNAMIC_DRAWGL_STREAM_DRAW。更多信息請見:http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage

+0

謝謝!現在完美工作。 – Brammie

+0

GL_DYNAMIC_DRAW用於在GPU上生成緩衝區內容並用於繪製:這似乎不是問題的情況。 – Luca

+0

他提到'glBufferData'需要1-2ms,改變使用提示可以加快它的速度。 「COPY」提示用於用戶從不直接讀取的GPU生成的數據。 –