【发布时间】: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.
}
这是测量每帧经过时间的错误方法吗?如果不是,为什么会出现性能下降?
这是输出的比较:
编辑:
片段着色器直接为每个片段设置颜色。
顶点着色器代码:
#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;
}
两者的输出相同,如下所示:
在使用专用 GPU 卡进行渲染时,所需的输出提高了帧速率,即附加的比较图像中的行之间的时间间隔更小。 对于 Intel 集成卡,渲染 1 帧需要
【问题讨论】:
-
为清晰和所需输出而编辑。
-
我也用 RenderDoc 来测量 FPS,差别很大。使用英特尔卡时,我得到大约 340 FPS。换成 NVIDIA 卡后,我只有 44 FPS。
-
这似乎不是我的应用程序的问题,而是显卡使用的问题。我尝试了基于 OpenGL 构建的各种应用程序,似乎 FPS 锁定在 45。我在 NVIDIA 控制面板中更改了“OpenGL Rendering GPU”属性,但它不起作用。