使用专用显卡进行 OpenGL 渲染时降低帧率

Lower framerate while using dedicated graphics card for OpenGL rendering

我正在使用 glDrawArraysInstanced 绘制由 8 个三角形组成的简单形状的 10000 个实例。

在更换用于我的 NVIDIA GTX 1060 的专用显卡时,我的帧率似乎变低了,而且还有一些明显的卡顿现象。

这是我用来查看每帧所用时间的代码:

std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
float i = (float)(std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()) / 1000000.0;
while (!glfwWindowShouldClose(window)){
    end = std::chrono::steady_clock::now();
    i = (float)(std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()) / 1000000.0;
    std::cout << i << "\n";
    begin = end;  //Edit
    //Other code for draw calls and to set uniforms.
}

这是不是测量每帧流逝时间的错误方法?如果不是,为什么性能会下降?

这是输出的比较:

Comparison Image

Updated Comparision Image

编辑:

片段着色器直接为每个片段设置颜色。

顶点着色器代码:

#version 450 core

in vec3 vertex;

out vec3 outVertex;

uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
uniform float time;

const float vel = 1.0;

float PHI = 1.61803398874989484820459; 

float noise(in vec2 xy, in float seed) {
    return fract(tan(distance(xy * PHI, xy) * seed) * xy.x);
}


void main() {

    float y_coord = noise(vec2(-500 + gl_InstanceID / 100, -500 + gl_InstanceID % 100),20) * 40 + vel * time;
    y_coord = mod(y_coord, 40)-20;

    mat4 translationMatrix = mat4(vec4(1,0,0, 0 ),vec4(0,1,0, 0 ),vec4(0,0,1, 0 ),vec4(-50 + gl_InstanceID/100, y_coord, -50 + gl_InstanceID%100,1));

    gl_Position = proj_matrix * mv_matrix * translationMatrix*vec4(vertex, 1);

    outVertex = vertex;
}

我正在更改 Visual Studio 用于渲染的卡:

extern "C" {
    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}

两者的输出相同,并在此处显示:

Output

在使用专用 GPU 卡进行渲染时,所需的输出增加了帧速率,即所附比较图像中行之间的时间间隔更小。 对于英特尔集成卡,渲染 1 帧需要 <0.01 秒。 对于专用 GPU GTX 1060,渲染 1 帧需要约 0.2 秒。

您的输出清楚地显示了时间单调递增,而不是围绕某个平均值抖动。这样做的原因是您的代码测量的是总运行时间,而不是每帧时间。要改为测量每帧时间,您需要在循环结束时进行 begin = end 调用,以便每帧的参考点是前一帧的结束时间,而不是整个帧的开始时间程序。

我通过 Disabling NVIDIA Physx GPU acceleration 解决了问题。由于某种原因,它会减慢图形渲染速度。现在,即使在渲染 ~100k 个实例时,我的 GPU 也能达到约 280 FPS。