2010-06-29 45 views
3

我想聽聽人們認爲Open GL ES(iPhone上)的最佳繪製調用是什麼。在OpenGL中最小化glDrawArray調用es

特別是我讀過很多地方最好減少調用glDrawArrays/glDrawElements的次數 - 我認爲蘋果說10應該是他們最近的WWDC演示文稿中的最大值。據我所知,要做到這一點,你需要把所有的頂點放到一個數組中,所以你只需要調用drawArrays一次。

但是我很困惑,因爲這肯定意味着你不能使用平移,旋轉,縮放功能,因爲它會應用於整個幾何體。除了這並不意味着你需要自己預先計算每個頂點的位置,而不是讓它開放來做這件事情,這很好。

另外,這並不意味着你不能使用任何風扇/條設置,除非你只有一個連續的形狀?

這些缺點讓我覺得我沒有正確理解的東西,所以我想我在尋找的確認,我應該:

  • 是試圖讓所有的三角形的尤伯杯陣列來繪製。
  • 讓我自己置身事實,我必須自己研究出所有的頂點位置。
  • 忘掉push'ing和pop'ing每樣東西畫成其所需位置

那是別人做什麼?

謝謝

回答

8

問題很多,配料總是妥協的問題。

正如你所提到的,性能的理想結構是包含所有要繪製的三角形的單個數組。

從這裏開始,我們就可以開始添加約束:

  • 一個附加的約束條件是 具有16位頂點索引保存 帶寬和內存,並可能 用平臺的快速路徑。所以 你可以考慮以65536個頂點爲單位對三角形 進行分組。

  • 然後,如果你想切換 着色器/材質/ glState用於繪製 幾何,你別無選擇(*),但 每 着色器/材質/ glState發出一個繪製調用。所以分組 三角形可以考慮通過 shaderID/materialID/glStateID進行分組。

  • 接下來,如果你想動畫的東西, 你別無選擇(*),但 發送您的轉換矩陣GL, 然後發出一個繪製調用。所以 分組三角形可以考慮通過「變換 羣體 分組三角形,例如,所有靜態 幾何在一起,動畫幾何 具有共同變換可以 分組了。

在這些情況下,在將網格合併在一起之前,您必須自己轉換頂點(使用CPU)。

關於三角形條紋,通過引入退化三角形,即使條形的拓撲中存在不連續性,也可以變換條紋中的任何網格。所以這是一種始終適用的技術。總而言之,減少繪製調用是一種妥協遊戲,一些技術可能適用於3d模型,而其他技術可能更適合其他3d模型。恕我直言,關鍵是要有創意,並仔細測試您的應用程序,以查看您的更改是否實際提高了目標平臺的性能。

HTH,歡呼聲,


(*)實際上有一些技術,允許以減少在這些情況下繪製調用,如數量:

  • texture atlases到組不同的紋理在一個單一的,以防止 切換紋理GL,因此 允許限制繪製調用

  • (僞)硬件實例,它們允許着色器從各種來源獲取變換 ,以不同的方式變換網格實例 。

  • ...

+0

優良回答一個很廣泛的問題。 – Dad 2011-01-22 21:25:16

+1

我主要編寫2D應用程序(精靈),所以總頂點數量非常低,但精靈數量可能相當高,並且我使用每個精靈的繪製調用。儘管如此,迄今爲止我只注意到與填充率有關的性能。我想盡可能地批量我的精靈(已經使用地圖集,單着色器),但我不知道爲每個獨立移動的對象重建VBO/VAO/IBO的成本是多少。 – 2014-03-11 06:44:53