我做了一些性能测试并想出了这个:
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 :(得分:5)
您的OpenGL驱动程序可能正在进行延迟渲染。
这意味着对glDrawArrays
和朋友的电话不会画任何东西。相反,它们会缓冲所有必需的信息,以便稍后执行操作。
实际渲染发生在SDL_GL_SwapWindow内。
这种情况很常见,因为您希望尽可能避免在CPU和GPU之间进行同步。