簡體   English   中英

glDrawElements在iOS上大量使用cpu

[英]glDrawElements massive cpu usage on iOS

硬件:iPad2軟件:OpenGL ES 2.0 C ++

glDrawElements似乎占用了大約25%的cpu。 使CPU 18ms和GPU每幀10ms。

當我不使用索引緩沖區並使用glDrawArrays時,它會加速並且glDrawArrays大麥會顯示在探查器上。 其他一切都是一樣的,glDrawArrays有更多的頂點因為我必須在沒有索引緩沖區的情況下復制VBO中的頂點。

至今:

  • 這兩種方法之間的狀態變化幾乎相同
  • 頂點結構是兩個浮點數(8個字節)。
  • indexbuffer是16bit(嘗試32位)
  • 兩個緩沖區的GL_SATIC_DRAW
  • 緩沖區在加載后不會改變
  • 相同的VBO和indexbuffer每幀渲染多次,具有不同的偏移和大小
  • 沒有opengl錯誤

所以看起來它正在做某種類型的軟件回退。 但我無法弄清楚會導致OpenGL回退的原因。

有一些事情會立即浮現在腦海中,這可能會影響您描述的速度。

例如,許多命令被動地發出以減少總線傳輸的數量。 它們排隊等待下一批轉移。 狀態更改,紋理更改和類似命令都會累積。 繪制命令可能在一種情況下觸發更大的轉移而在另一種情況下不觸發,或者您在一種情況下觸發更頻繁的轉移。 另一方面,您的特定模型可能會更好地組織一個或另一個繪制調用。 您需要查看它們的大小,是否重用索引值,以及它們是否經過優化或重新排序以進行渲染。 glDrawArrays可能需要傳輸更多數據,但如果您的模型很小,則開銷可能不會太大。 繪制頻率變得很重要,因為你想經常排隊,以保持卡忙,讓你的CPU做其他工作,你不希望它只是累積在等待發送的命令緩沖區,但它需要平衡,因為這些轉移需要付出代價。 最重要的是,經常索引的值可以在頻繁重用時從緩存效果中受益,但線性訪問的數組在線性訪問時可以從緩存效果中受益,因此您需要知道您的數據,因為不同類型的數據受益於不同的方法。

甚至Apple似乎也不確定使用哪種方法。

直到iOS7,該版本和之前的IOS OpenGL ES編程指南寫道:

為了獲得最佳性能,您的模型應使用glDrawArrays作為單個無索引三角形條提交,並盡可能少復制頂點。 如果模型需要復制許多頂點(...),則可以使用單獨的索引緩沖區並調用glDrawElements來獲得更好的性能。 ...為獲得最佳效果,請使用索引和未編制索引的三角形條測試模型,並使用速度最快的三角形條。

但他們更新的適用於iOS8的OpenGL ES編程指南提供了相反的結果:

為獲得最佳性能,您的模型應作為單個索引三角形條提交。 要避免在頂點緩沖區中多次指定同一頂點的數據,請使用單獨的索引緩沖區並使用glDrawElements函數繪制三角形條帶

看起來在你的情況下你剛剛嘗試了兩種方法,並發現一種方法更適合你的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM