2014-01-26 130 views
0

我目前正在編寫一個使用OpenGL的小型遊戲引擎。 使用GL_STATIC_DRAW將網格數據上傳到vbos。 由於我讀glBindBuffer相當慢,我試圖通過累積渲染所需的信息,然後使用每個vbo只有一個glBindBuffer多次渲染一個vbo(有點像批處理渲染?)來儘量減少它的使用。 這裏是我使用的實際渲染代碼:OpenGL窗口很慢

int lastID = -1; 
    for(list<R_job>::iterator it = jobs.begin(); it != jobs.end(); ++it) { 
     if(lastID == -1) { 
      lastID = *it->vboID; 
      glBindTexture(GL_TEXTURE_2D, it->texID); 
      glBindBuffer(GL_ARRAY_BUFFER, *it->vboID); 
      glVertexPointer(3, GL_FLOAT, 4*(3+2+3), 0); 
      glTexCoordPointer(2, GL_FLOAT, 4*(3+2+3), (void*)(4*3)); 
      glNormalPointer(GL_FLOAT, 4*(3+2+3), (void*)(4*(3+2))); 
     } 

     if(lastID != *it->vboID) { 
      glBindTexture(GL_TEXTURE_2D, it->texID); 
      glBindBuffer(GL_ARRAY_BUFFER, *it->vboID); 
      glVertexPointer(3, GL_FLOAT, 4*(3+2+3), 0); 
      glTexCoordPointer(2, GL_FLOAT, 4*(3+2+3), (void*)(4*3)); 
      glNormalPointer(GL_FLOAT, 4*(3+2+3), (void*)(4*(3+2))); 
      lastID = *it->vboID; 
     } 

     glPushMatrix(); 
     glMultMatrixf(value_ptr(*it->mat)); //the model matrix 
     glDrawArrays(GL_TRIANGLES, 0, it->size); //render 
     glPopMatrix(); 
    } 

名單是由維也納各組織的ID進行排序。數據交錯。 我的問題是關於速度。此代碼可以在我的2010年macbook上以30 fps的速度渲染大約800個vbos(相同的,只有drawArrays被稱爲多次)。在我的電腦(Phenom II X4 955/HD 5700)上,只有400個電話,fps低於30.有人可以向我解釋這一點嗎?我希望在我的電腦上加速。我也爲每臺機器使用GLFW,GLEW,Xcode和VS2012。

編輯: 我渲染的網格大約有600個vert。

+0

這可能聽起來像一個愚蠢的問題,但是它是按照頂點計數還是以字節爲單位定義的「it-> size」?如果是後者,那麼你繪製的頂點比實際擁有的更多。使用VBOs時,GL通常不會崩潰(在繪製調用中超出頂點數組),但性能會下降。 –

+0

我重複檢查,它 - >大小是頂點的數量。我將用創建vbos的代碼更新問題。 – Teris

+0

我的應用程序的其他部分可能在Windows上較慢嗎?我正在使用一些stl容器。但XCode時間分析器說,90%的時間花在glDrawArrays上...... – Teris

回答

2

我確定您在發佈模式下運行,但您也可以考慮在發佈模式下運行而不附帶調試器。我想你會發現這樣做會解決你的性能問題與list :: sort。根據我的經驗,VS調試器在連接時會產生顯着的性能影響 - 遠遠超過gdb。

2000個實體是開始看到一些FPS下降的合理位置。到那時,你每幀可以接近10,000個API調用。爲了獲得更高的舒適度,你需要開始做一些實例化的事情,這樣你就可以用一次調用來繪製多個實體。

最後,我想說glBindBuffer不是一個昂貴的操作,並不是真的應該批量避免的東西。如果要批量批處理以避免更改着色器和着色器狀態(制服)。但不要批處理以避免更改緩衝區對象。

+0

感謝您的信息!雖然我相信我有VC運行沒有調試器(CTRL + F5?)。如果切換着色器的速度確實很慢,那麼我將對其進行批處理。 – Teris

+0

我沒有足夠的代表進行「新評論」,因此我正在回覆您的帖子。首先它*非常*奇怪,*啓用*垂直​​同步增加你的FPS。我不知道GLFW swapBuffers的細節(我使用SDL),但出了問題。通常,VSync應該總是降低幀率(因爲它會強制緩衝區交換以等待下一次垂直刷新)。 –

+0

根據FPS drop @ 2000實體:是的,這對您的顯卡來說聽起來很合理。如果你在片段着色器中做了不重要的工作量(比一個或兩個以上的紋理樣本多),這更加合理。確保您使用的是mip-mapping(將minfilter設置爲LINEAR_MIP_LINEAR),因爲在非mipmapped紋理上進行的大量紋理採樣可能會導致FPS死亡,尤其是對於高分辨率紋理。除此之外,如果您想要推高,則考慮實例化,因爲此時您可能會遇到驅動程序開銷飽和(太多的GL調用)。 –

0

所以我想我找到了答案。 在AMD Control Center中啓用VSync可以極大地增加fps(可能是因爲GLFW的swapBuffers),儘管它們仍然低於我的macbook的值。經過一些調試後,我發現列表::排序在某些方面非常緩慢,並在Windows上拉我的FPS ...

所以現在(沒有列表::排序),fps下降(< 60)在2000左右實體:600 * 2000 = 1 200 000

應該是我的圖形卡限制?