我正在使用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 卡进行渲染时提高帧速率,即所附比较图像中行之间的时间间隔更小。 对于英特尔集成卡,渲染 1 帧需要 <0.01 秒。 对于专用 GPU GTX 1060,渲染 1 帧需要 ~0.2 秒。
我通过禁用 NVIDIA Physx GPU 加速解决了这些问题。由于某种原因,它会减慢图形渲染速度。现在,即使在渲染 ~280k 个实例时,我的 GPU 也能获得大约 ~100 FPS。
您的输出清楚地显示时间单调增加,而不是围绕某个平均值抖动。 原因是您的代码测量的是总运行时间,而不是每帧时间。 为了使其测量每帧时间的稳定性,您需要在循环结束时进行begin = end
调用,以便每个帧的参考点是前一帧的结束,而不是整个程序的开始时间。