c++ - SDL_GL_SwapWindow 性能不佳

标签 c++ opengl graphics sdl

我做了一些性能测试并想出了这个:

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。我很难过。

最佳答案

您的 OpenGL 驱动程序可能正在执行延迟渲染。

这意味着调用 glDrawArrays 和 friend 不会绘制任何东西。相反,它们会缓冲所有必需的信息以便稍后执行操作。

实际渲染发生在 SDL_GL_SwapWindow 中。

现在这种行为很典型,因为您希望尽可能避免在 CPU 和 GPU 之间进行同步。

关于c++ - SDL_GL_SwapWindow 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34650517/

相关文章:

c++ - 如何定义模板类的模板

c++ - 在没有中间光栅的情况下在 OpenGL 中显示 SVG

ios - [EAGLContext presentRenderbuffer] 中的 gpus_ReturnGuiltyForHardwareRestart 崩溃

c++ - 为什么我的循环只从我的 .obj 文件中读取一个字符?

c++ - QOpenGL : Color Index mode

openGL 在像素传输期间反转纹理方向?

C++保存在文件中并最终绘制数据

c++ - 平凡与非平凡类型的复制省略差异

c++ - Boost Overload 奇怪的行为.. `int (int ), int (std::string )` 与 `int (int ), int (std::string ), std::string (std::string)` 有何不同?

c++ - 是否有通过引用分配 shared_ptr 的用例?