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

Posted

技术标签:

【中文标题】使用专用显卡进行 OpenGL 渲染时帧率降低【英文标题】:Lower framerate while using dedicated graphics card for OpenGL rendering 【发布时间】:2020-07-01 16:36:08 【问题描述】:

我正在使用 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 卡进行渲染时,所需的输出提高了帧速率,即附加的比较图像中的行之间的时间间隔更小。 对于 Intel 集成卡,渲染 1 帧需要

【问题讨论】:

为清晰和所需输出而编辑。 我也用 RenderDoc 来测量 FPS,差别很大。使用英特尔卡时,我得到大约 340 FPS。换成 NVIDIA 卡后,我只有 44 FPS。 这似乎不是我的应用程序的问题,而是显卡使用的问题。我尝试了基于 OpenGL 构建的各种应用程序,似乎 FPS 锁定在 45。我在 NVIDIA 控制面板中更改了“OpenGL Rendering GPU”属性,但它不起作用。 【参考方案1】:

我通过Disabling NVIDIA Physx GPU acceleration 解决了这些问题。由于某种原因,它会减慢图形渲染速度。现在,即使渲染约 10 万个实例,我的 GPU 也能获得约 280 FPS。

【讨论】:

【参考方案2】:

您的输出清楚地显示时间单调增加,而不是在某个平均值附近抖动。原因是您的代码正在测量总经过时间,而不是每帧时间。要使其测量每帧时间,您需要在循环结束时调用begin = end,以便每一帧的参考点是前一帧的结束,而不是整个程序的开始时间。

【讨论】:

嘿,我应该用那个。如果我在当前输出中获取连续行的差异,我不会得到时间帧吗? @curs0r:: 是的,你会的。另外,抱歉,我的回答并没有真正解决您关于集成显卡和 GPU 显卡之间性能差异的真正问题。我怀疑 tan() 调用正在使用专用的 x86 内在 w/集成图形,而 GPU 必须做更多的工作来计算它。没有证据——只是一个疯狂的猜测。 可能是这样,我会尝试更多地研究它。感谢您的意见,为了更清晰,我添加了另一张比较图片。

以上是关于使用专用显卡进行 OpenGL 渲染时帧率降低的主要内容,如果未能解决你的问题,请参考以下文章

opengl 打开和关闭垂直同步方法

OpenGL:纹理基元 + 高帧率

地图渲染 优化方法

intel集成显卡开opengl模式卡

GPU渲染流程

OpenGL:使用 FBO 和视口偏移问题渲染到纹理