2013-01-17 30 views
5

在爲我正在處理的iPhone/iPad的小型項目進行一些測試時,我觀察到在使用GL_LINES使用glDrawElements繪製線框時存在很大的CPU性能損失。帶GL_LINES的glDrawElements強制gleRunVertexSubmitARM? (或:爲什麼繪製線框在iOS上很慢?)

這是情景:

  • 640個頂點(4個浮點的位置,3周的float法線,沒有對齊的問題......都在4個字節邊界)
  • 3840指數(無符號短)的模型
  • 兩個頂點和索引使用維也納組織(無VAO)
  • 與GL_TRIANGLES glDrawElements繪製上述優良樣板工程

然後:

  • 640個頂點
  • 2560指數
  • 維也納組織和無VAO
  • 同型號與GL_LINES glDrawElements繪製觸發連續通話gleRunVertexSubmitARM,CPU使用率天空火箭...

在這兩種情況下,模型看起來像預期的一樣,沒有附近的glErrors ...

看來問題是依賴於設備的。我在iPhone 3GS和iPhone 4上體驗它,而不是在iPad 2上,也不在模擬器上。 在iPad 2幀時間CPU = 1ms且未調用gleRunVertexSubmitARM時,iPhone 4幀時間CPU = 12ms,並連續調用gleRunVertexSubmitARM。

任何人都可以解釋這種行爲或指出我可能犯的錯誤嗎?

任何有識之士高度讚賞。 由於提前,

弗朗西斯

回答

0

不是一個容易回答一個不容易的問題,我會說。

無論如何,同一個「家庭」的2臺設備表現不同的原因可能取決於許多因素。

首先,他們安裝不同的GPU(我很相信你已經知道了的話,對不起,狀態明顯),這帶來以下區別:

  • iPhone 4和iPhone 3GS的安裝相同的GPU ,PowerVR的SGX535
  • IPAD 2使用的PowerVR SGX543MP2

首先,後者是第一的演進與很多不同的吞吐量和一個較新的體系結構。

這本身並不能解釋所有事情,您注意到更多的gleRunVertexSubmitARM調用可以解釋爲由PowerVR在其GPU上執行的OpenGL驅動程序實現,很可能SGX535 GPU驅動程序通過執行您需要的操作掛鉤該功能。

最後,但並非最不重要的,在性能方面,與GL_LINES繪畫是大部分時間非常低效的有以下幾個原因:

  • 不執行任何隱藏的幾何形狀檢測
  • 不執行任何臉型剔除
  • 012-
  • 使用GL_LINE_WIDTH或GL_LINE_SMOOTH閱讀(以及有關2 - 3年前我的經驗)會導致驅動程序執行不使用任何HW加速的「軟件」渲染。這取決於GPU和OpenGL驅動程序的實現
  • 當渲染填充的多邊形時,驅動程序可以使用「層級深度緩衝區」來優化操作,而GL_LINES則不能(這又取決於驅動程序的多少,但這是一個非常常見的方面)
  • 某些驅動程序在渲染時將三角形中的GL_LINES網格平移。這是我無法證明的事情,但與過去的遊戲引擎開發者朋友是一個非常常見的話題。

我希望能以某種方式幫助你。

僑 莫里吉奧

0

我的電腦,但我覺得這是相關的。 我注意到了線框模式下的幀速率:glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)...

如果glEnable(GL_LINE_SMOOTH);

您可以使用此命令將其禁用:glDisable(GL_LINE_SMOOTH);