2011-09-05 132 views
1

我正在試驗幾種繪製大量精靈的方法(例如,對於粒子系統),我有一些不確定的結果。因此,這是我想和我有什麼: 這樣做是繪製25K精靈:加速在OpenGL中繪製旋轉和縮放的圖像

  1. 使用正則glBegin/glEnd並利用三角函數計算頂點 - 17-18fps。
  2. 使用常規glBegin/glEnd,但使用glRotate,glTranslateglScale來轉換精靈-14-15fps。
  3. 使用頂點數組而不是glBeginglEnd,但仍使用trig來計算頂點位置 - 10-11fps。
  4. 使用頂點數組而不是glBeginglEnd,但使用glRotate,glTranslateglScale來轉換精靈-10-11fps。

所以我的問題是,爲什麼使用頂點數組比使用glBegin/glEnd而我已閱讀(這裏偶),它應該是快慢?

爲什麼不使用自己的三角(這在我的情況是5個COS,5罪,超過5個部門,15次乘法和10加法/減法)比使用5個功能(glPushMatrix()glTranslated()glRotated()更快, glScaled()glPopMatrix())。我雖然他們在GPU上完成,所以它應該很快,更快

當繪製較少的精靈時,我確實會得到更有希望的結果。就像我繪製10k精靈時一樣,那麼頂點數組的速度可以快5fps,但仍然不一致。另外請注意,比這些fps可以增加整體,因爲我有其他計算正在進行,所以我沒有真正看fps本身,但他們之間的差異。就像是如果頂點陣列和gl變換比手動觸發多5-10幀/秒,那麼我會很高興,但現在看來,這似乎不值得冒這個麻煩。他們會幫助移植到GLES(因爲它沒有glBegin/glEnd),但我想我會爲此做一個單獨的實現。

那麼有什麼辦法可以在不使用幾何着色器的情況下加快速度嗎?我真的不明白他們(也許是一些很棒的教程?),他們可能會破壞與舊硬件的兼容性,所以我想在不使用着色器的情況下擠壓所有果汁。

+0

這似乎真的很低。 CPU/GPU規格? – genpfault

回答

0

您是否考慮過使用glPoints ...()代替?這是他們設計要做的事情,取決於你支持哪個版本的OpenGL。

0

您是否嘗試過使用VBO?他們是目前的標準,所以大多數卡都是有利於他們的。

另外:

  • 你應該使用自己的數學計算
  • 考慮卸載儘可能多的計算儘可能着色器

FPS的金額會貼有相反的是人們可能預期 - 你可能做錯了什麼。你可以粘貼一些你的渲染代碼嗎?

+0

是的,我也想到VBO。它們對於靜態精靈來說會很快(因爲你只是在紋理上繪製,就是這樣),但是如果我爲每個精靈製作動畫,那麼最終我會以某種方式繪製它們。 – Harry

3

所以我的問題是爲什麼使用頂點數組比使用glBegin/glEnd更慢,而我已閱讀(這裏甚至)它應該更快?

誰說他們慢?

您可以說的是,對於您的特定硬件,對於您當前的驅動程序,glBegin/glEnd較慢。你有沒有在其他硬件上驗證過?

更重要的是,的問題如何你正在繪製這些。你是否從頂點數組中繪製單個精靈,然後繪製另一個,然後繪製另一個精靈?還是你畫全部其中單個glDrawArraysglDrawElements打電話?

如果你不是一次完成所有的繪圖(或者至少是大量的繪圖),那麼你的速度不會像你應該那麼快。

爲什麼不使用自己的三角(這在我的情況是5個COS,5罪,超過5個部門,15次乘法和10加法/減法)比使用5個功能(glPushMatrix()更快, glTranslated(),glRotated(),glScaled(),glPopMatrix())。我雖然他們在GPU上完成,所以它應該是更快。

好吧,讓我們來想一想。 glPushMatrix不需要任何費用。 glTranslated創建一個雙精度浮點矩陣,然後做一個矩陣乘以glRotated做至少一個正弦和一個cos,做一些加法和減法來計算一個矩陣(全部以雙精度),然後做一個矩陣乘以glScaled計算矩陣,矩陣乘以

每個「做矩陣乘法」由16個浮點乘法和12個浮點加法組成。既然你要求雙精度數學,你可以忘記SSE向量數學或其他什麼;這是做標準的數學。並且您爲的每個點做這些中的3個。

GPU上發生的事情是該矩陣與頂點位置的乘積。而且由於在改變矩陣之前你只能通過4個位置,所以速度較慢並不奇怪。

+0

好的。謝謝。我真的沒有辦法一次性使用一個glDrawArray來繪製它們,儘管我可能會以某種方式改善它。 也感謝您解釋翻譯的工作原理。所以如果我把更多的頂點放在數組中,它們應該更快?你說「對於每一個點」,因此,當我對每個單獨的小組或者小組進行這樣的操作時,似乎不應該有速度增益。 另外,我說glBegin/glEnd更快,而不是更慢。 – Harry

+0

我想我應該明確地指出@Nicol Bolas沒有在最後一段中暗示的逐字位中聲明:glRotate,glTranslate,glScale在CPU上執行,只有結果矩陣被傳送到GPU。 – datenwolf

+0

謝謝datenwolf。這解釋了很多。此外,是否有可能使用一個紋理座標爲我drawin vertexarray所有四邊形?我現在正在基準尼科爾提出的建議,我嘗試通過填充頂點數組來繪製n個精靈。我只是不希望與texcoord數組一樣,因爲它應該是: \t GLfloat texCoords [] = {0.0,0.0,tbx,0.0,tbx,tby,0.0,tby};然後重複使用所有繪製的精靈。我試着將「步幅」設置爲-sizeof(GLfloat)* 4,希望它能夠提前穿過線條,然後再回到4條線索,然後再做一次,但這很可惜並不起作用。 – Harry

0

你有使用雙精度矩陣函數的具體原因嗎?他們通常比單精度慢很多。

+0

我嘗試了浮動精度矩陣函數,但他們似乎並沒有多少(或根本)改變速度。可能是因爲它在所有事情的宏偉計劃中都不重要。繪製圖像本身是現在緩慢的部分。不過謝謝你告訴我這些。 :)我不需要雙精度,所以我改變了所有的浮動。 – Harry