2011-01-25 112 views
3

我正在爲OpenGL ES 1.1中的iPhone開發遊戲;在每個節點都有一個子節點列表的數據結構中,我有很多紋理四邊形。因此,我從根部遍歷結構,並對每個四邊形進行渲染,然後對其子進行渲染,等等。優化OpenGL ES應用程序。我應該儘可能避免調用glVertexPointer嗎?

問題是,對於每個四元組,我調用glVertexPointer來設置頂點。

  • 我應該避免爲每個四元組調用它嗎?例如只會提高性能一次?
  • glVertexPointer將頂點複製到GPU內存或者只保存指針?

儘量減少通話次數並不容易,因爲每個節點可能有不同的四元組。我有相同的頂點數據相同的精靈,但我不一定渲染一個又一個,因爲我可能正在繪製他們之間的一個不同的精靈。

感謝。

回答

10

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%。

+0

+1很好的答案。 – 2011-01-25 16:05:31

相關問題