我目前正在編寫一個使用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。
這可能聽起來像一個愚蠢的問題,但是它是按照頂點計數還是以字節爲單位定義的「it-> size」?如果是後者,那麼你繪製的頂點比實際擁有的更多。使用VBOs時,GL通常不會崩潰(在繪製調用中超出頂點數組),但性能會下降。 –
我重複檢查,它 - >大小是頂點的數量。我將用創建vbos的代碼更新問題。 – Teris
我的應用程序的其他部分可能在Windows上較慢嗎?我正在使用一些stl容器。但XCode時間分析器說,90%的時間花在glDrawArrays上...... – Teris