2016-01-07 120 views
0

我做了一些性能測試以及與此想出了:SDL_GL_SwapWindow糟糕的表現

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

for(U32 i=0;i<objectList.length();++i) 
{ 
    PC d("draw"); 
    VoxelObject& obj = *objectList[i]; 
    glBindVertexArray(obj.vao); 
    tmpM = usedView->projection * usedView->transform * obj.transform; 
    glUniformMatrix4fv(shader.modelViewMatrixLoc, 1, GL_FALSE, tmpM.data()); 
    //glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, typesheet.tbo); 
    glUniform1i(shader.typesheetLoc, 0); 
    glDrawArrays(GL_TRIANGLES, 0, VoxelObject::VERTICES_PER_BOX*obj.getNumBoxes()); 
    d.out(); // 2 calls 0.000085s and 0.000043s each 

} 

PC swap("swap"); 
SDL_GL_SwapWindow(mainWindow); // 1 call 0.007823s 
swap.out(); 

SDL_GL_SwapWindow(mainWindow);呼叫正在比繪製調用更長的200倍!據我的理解,我認爲所有的功能應該做的是交換緩衝區。這意味着交換所花費的時間將根據屏幕大小進行縮放?不,它基於幾何的數量進行縮放......我在網上做了一些搜索,我有雙緩衝啓用和vsync關閉。我很難過。

+0

也許你沒有使用硬件加速的OpenGL實現。使用glGetString獲取OpenGL供應商以找出問題。 –

回答

4

您的OpenGL驅動程序可能會執行延遲渲染。

這意味着撥打glDrawArrays和朋友的電話不會畫任何東西。相反,他們會緩存所有必需的信息以便稍後執行操作。

實際渲染髮生在SDL_GL_SwapWindow內部。

這種行爲現在很典型,因爲您想避免必須儘可能地在CPU和GPU之間進行同步。