glVertexPointer只保留指針,但在OpenGL驅動程序中發生狀態更改並顯式同步,因此成本相當高。通常當你說'這裏是我的數據,請繪製'時,GPU開始繪製,並且繼續與CPU上發生的任何事情同時進行,並且持續時間儘可能長。當你改變渲染狀態時,它需要完成它在舊狀態下所做的任何事情。所以通過每四次更改一次,您就可以有效地強制併發處理是連續的。因此,避免每個quad的glVertexPointer(大概是glDrawArrays或glDrawElements?)應該給你一個很大的好處。
立即優化是簡單地保持數據結構中總共四元組的數量的計數,爲至少具有該尺寸的頂點分配單個目標緩衝區,並讓所有四邊形將其幾何體複製到目標緩衝區中比每次調用glVertexPointer。然後調用glVertexPointer和您的繪圖調用(希望壓縮一個調用),最後使用一個大數組。它在CPU方面成本更高一些,但並行性和缺乏重複的GPU/CPU同步會爲您節省很多。雖然tip around於NDA當前的主題,但我強烈建議您看看Xcode 4測試版。 Apple的其他功能stated publicly to be present是OpenGL ES分析器。所以你可以很容易地比較方法。
要將數據複製到GPU,您需要使用頂點緩衝區對象。這意味着創建一個帶有glGenBuffers
的緩衝區,用glBufferData
將數據推送到該緩衝區,然後發佈一個地址爲例如1的glVertexPointer。如果您上傳的數據中的第一個字節是頂點的第一個字節,則爲0。在ES 1.x中,您可以上傳數據爲GL_DYNAMIC_DRAW
來標記您打算經常更新並經常從中抽取數據。如果你可以進入比上傳更頻繁的位置,這可能是值得的。
如果您曾經切換到ES 2.x也有GL_STREAM_DRAW
,這可能值得調查,但與您的問題沒有直接關係。我提到它,因爲它可能會出現,如果你的谷歌的頂點緩衝區對象,可在桌面OpenGL。 ES 1.x的選項僅爲GL_STATIC_DRAW
和GL_DYNAMIC_DRAW。
我剛剛在一個iPad ES 1.x應用程序中使用了對象,每個對象都會改變每個幀,但是每個使用的渲染管線都會繪製兩次。屏幕上只有五個這樣的對象,每個頂點有40個,但是從初始實現切換到VBO實現會減少總處理時間的20%。
+1很好的答案。 – 2011-01-25 16:05:31