2009-07-12 161 views
3

我在openGL中繪製四邊形。我的問題是,是否有任何與此額外的性能增益:OpenGL四次渲染優化

// Method #1 

glBegin(GL_QUADS); 
// Define vertices for 10 quads 
glEnd(); 

...在這樣每個10個四邊形:

// Method #2 

glBegin(GL_QUADS); 
// Define vertices for first quad 
glEnd(); 

glBegin(GL_QUADS); 
// Define vertices for second quad 
glEnd(); 

//etc... 

所有四邊形使用相同的紋理在此案件。

回答

3

我決定繼續並使用10,000個四元組的循環進行基準測試。

結果:

方法1:0.0128秒

方法2:0.0132秒

方法#1確實有一定的改善,但這種改善是很邊緣(3%)。這可能只不過是簡單地調用更多函數的開銷。所以很可能OpenGL本身沒有從方法1中獲得任何額外的優化。

這是使用OpenGL 2.0的Windows XP Service Pack 3和Visual Studio 2005的

+0

您是如何基準測試的?對OpenGL調用進行基準測試非常困難 - 只需在調用之前和之後設置計時器,並不一定會考慮將數據發送到GPU,GPU上的任何計算以及渲染。 – 2009-07-13 03:53:54

2

我相信答案是肯定的,但你應該自己嘗試一下。寫一些東西來繪製100k的四邊形,看看是否更快。然後在這裏報告你的結果:)

schnaader:你讀的文檔中的含義是你不應該在glBegin和glEnd之間有非gl相關的代碼。它們並不意味着你應該多次調用它,而是通過簡短的位來調用它。

+0

感謝您的回答,我的結果發佈在下面的答案:) – 2009-07-12 18:24:57

0

我想通過重新使用頂點可以獲得最高的性能增益。爲了達到這個目的,你需要自己維護一些基元的結構。

9

是的,第一個更快,因爲每次調用glBeginglEnd都會改變OpenGL狀態。

更妙的是,然而,比一個調用glBeginglEnd(如果你有頂點的顯著數),是通過所有的頂點與glVertexPointer(朋友),然後打一個電話,到glDrawArraysglDrawElements 。這將一舉將所有頂點發送到GPU,而不是通過反覆調用glVertex3f遞增。

4

從函數調用開銷的角度來看,第二種方法更加昂貴。如果不是十個四元組,我們使用了一萬個。然後,glBegin/glEnd將被稱爲每幀一萬次而不是一次。

更重要的是,從OpenGL 3.0開始,glBegin/glEnd已被棄用,OpenGL ES不支持。

而是使用諸如glDrawArrays之類的調用將頂點上載爲頂點數組。教程和更深入的信息可以在NeHe site上找到。

0

你會得到更好的性能一定能在到底有多少代碼被由CPU調用。

無論您的繪圖性能在GPU上是否會更好,這完全取決於您的3D圖形卡驅動程序的實現。使用不同製造商的驅動程序,甚至是同一張卡的不同版本的驅動程序,您可能會得到潛在的大不相同的結果。