2014-03-05 43 views
2

我正在開發一個程序的一部分,其中給出了xyz座標的集合,構建了3D模型。我具備了完成此圖片所需的所有功能(即平移,旋轉,縮放),但給出的xyz座標越多,我的程序運行越慢。我的程序在處理29,000個座標時運行得非常順利,但是當我有300,000個點時,我的程序變慢了。我使用SharpGL爲了在WPF中使用OpenGL。插入所有這些問題的代碼如下:OpenGL:更多的頂點,性能更差

gl.Begin(OpenGL.GL_LINES); 

     for (int i = 0; i < (parser.dataSet.Count - 1); i++) 
     { 

      gl.Color(1.0f, 0.0f, 0.0f); 
      gl.Vertex(parser.dataSet[i].X/parser.xDiv, parser.dataSet[i].Y/parser.yDiv, parser.dataSet[i].Z); 
      gl.Vertex(parser.dataSet[i + 1].X/parser.xDiv, parser.dataSet[i + 1].Y/parser.yDiv, parser.dataSet[i + 1].Z); 
     } 

     gl.End(); 
     gl.Flush(); 

我做得noobish(IM不熟悉的OpenGL),我可以修復?有人提到縮小我的數據,我並不完全反對,但是當我「縮放」(重新縮放)圖片時,是否有一種「縮小比例」的方法?

回答

7

300,000點的即時模式(glBegin()/glEnd())函數調用開銷爲海量

使用頂點數組或頂點緩衝對象批量提交幾何。這樣你就可以在10-20個電話中畫出所有點數,而不是將近100萬個點數。

+0

這會給你最直接的性能提升。我還建議專門使用頂點緩衝區對象,因爲它們不必每幀都發送到顯卡,因此比頂點陣列更爲複雜。它們有點複雜,因爲你將不得不編寫着色器來處理它們,但加速是值得的。以下是關於它們的快速教程:http://3dgep.com/?p=2596 – redsoxfantom

+0

@redsoxfantom實際上可以使用帶固定功能管道的頂點緩衝區,使用爲屬性位置提供默認值的nVidia擴展或使用glGetPointerv – Jherico

+0

我非常新的OpenGL和我使用夏普如此裸露與我。 @redsoxfantom我看了這個指南,我很困惑定義頂點indeces。我根本沒有真正使用三角形,我只是從一個點到另一個點畫一條線,等等。我不明白如何找到索引。 – TheBlindSpring

0

genpfault'使用頂點緩衝區'的答案是正確的答案,但值得注意的是,如果您受限於目標環境和/或無法解決遠離OpenGL 1.x API的端口問題,那麼是display lists的替代品。

使用顯示列表創建並激活列表對象(使用glGenListsglNewList),該對象本質上充當頂點調用的記錄器。在您激活列表後,您將像往常一樣致電您的渲染調用(glBeginglEnd,glVertex等)。完成幾何圖形後,您可以撥打glEndList,完成錄製。將來,當您想渲染相同的幾何圖形時,您可以簡單地撥打glCallList作爲快捷方式。因爲列表數據可以由驅動程序捕獲並存儲在視頻卡上,所以開銷要小得多。

但是,使用顯示列表有一些警告。有一整套OpenGL函數不能從列表中調用,它們只適用於靜態幾何。另外,不能保證驅動程序實際上將信息存儲在顯卡上,這意味着不一定有很好的性能提升。你最好的選擇是從即時模式和固定功能管道遷移出去。

+0

您可以使用固定功能流水線的VBO。 – genpfault

+0

你是對的。事實上,我在你的回答下指出了同樣的事情redsoxfan。我的意思是說,與'遠離GL 1.x的端口'不同的是'可編程管道的端口'。將更新我的答案。 – Jherico

1

要添加只是鹽的糧食,可以優化師出:

divParserDotxDiv=1.0f/parser.xDiv; 
divParserDotyDiv=1.0f/parser.yDiv; 
gl.Color(1.0f, 0.0f, 0.0f); 
for (int i = 0; i < (parser.dataSet.Count - 1); i++) 
     { 


      gl.Vertex(parser.dataSet[i].X * divParserDotxDiv, 
         parser.dataSet[i].Y * divParserDotyDiv, 
         parser.dataSet[i].Z); 
      gl.Vertex(parser.dataSet[i + 1].X * divParserDotxDiv, 
         parser.dataSet[i + 1].Y * divParserDotyDiv, 
         parser.dataSet[i + 1].Z); 
     } 

這應該是至少1%至3%,快:)