OpenGL中从2k帧缓冲区切换到4k帧缓冲区时PCIe带宽利用率激增

OpenGL中从2k帧缓冲区切换到4k帧缓冲区时PCIe带宽利用率激增,opengl,profiling,gpu,framebuffer,Opengl,Profiling,Gpu,Framebuffer,我渲染了一个简单的场景,总共有50个主场景、阴影、反射和后处理贴图的drawcalls。对于下面的测试,我将阴影贴图大小设置为4k(4096x4096),并改变反射贴图大小 该测试将在具有1Gb视频内存的NVidia GTX 650上运行。当测试应用程序运行时,所有运行的应用程序只使用了600+mb的视频内存,因此我有200-300 mb的可用视频RAM。Vsync被禁用,并且应用程序中没有FPS边界,因此GPU利用率为99%-100%。使用Nvidia驱动程序工具测量所有指标: 好的,让我们

我渲染了一个简单的场景,总共有50个主场景、阴影、反射和后处理贴图的drawcalls。对于下面的测试,我将阴影贴图大小设置为4k(4096x4096),并改变反射贴图大小

该测试将在具有1Gb视频内存的NVidia GTX 650上运行。当测试应用程序运行时,所有运行的应用程序只使用了600+mb的视频内存,因此我有200-300 mb的可用视频RAM。Vsync被禁用,并且应用程序中没有FPS边界,因此GPU利用率为99%-100%。使用Nvidia驱动程序工具测量所有指标:

好的,让我们启动应用程序并根据反射贴图大小测量其FPS:

  • 1k及以下-110 FPS
  • 2k-102 FPS
  • 4k-38 FPS
从2k反射纹理切换到4k反射纹理会显著降低FPS速率,而测量工具显示PCI带宽利用率异常,从1%增加到65%。同时,使用的视频内存量不超过700Mb(1Gb可用)

好的,让我们运行并查看最重的OpenGL调用是什么。它显示反射贴图的
glClear
需要10毫秒以上!将反射贴图切换到2k会将该值降低到数千纳秒,这对于当今的硬件来说是正常的。您可能会说,
glClear
实际上会刷新所有以前的渲染命令,但是如果我在调试器中禁用clear调用,帧速率将增加到90-100 FPS

这种行为也可以通过Emscripten+Chrome进行复制,但在Chrome中,慢速功能是
GLDraweElements
,用于将地形绘制到阴影地图。更奇怪的是,绘制主场景地形(使用更重的片段着色器)所需的时间更少

那么问题是什么呢?为什么驱动程序在拥有300Mb可用视频内存的情况下通过PCIe传输内容?原因可能是纹理或帧缓冲区使用不当