OpenGL着色器制服变慢

时间:2017-06-27 16:06:13

标签: c++ opengl graphics gpu

问题

我正在使用OpenGL在C ++中开发一些程序性地形生成。作为IDE,我正在使用Microsoft VS2017。我可以毫无问题地运行“实验”。但经过大约两个小时的开发,该计划开始放缓。在十分钟左右的时间内,帧率从100以上下降到20.不久之后,我的GPU无法每秒渲染一帧。启动程序时,加载着色器并链接程序需要一段时间。

可能的原因

在VS2017中进行了一些调试和分析之后,结果发现超过98%的CPU等待GPU完成着色器统一操作。这包括找到统一变量的位置并将三个基质加载到均匀变量。

疑难解答步骤

我尝试了各种不同的方法来改善情况,包括以下情况,但我无法在不重新启动电脑的情况下解决问题

  • 将.exe和资产复制到另一个文件夹
  • 将.exe和资产复制到另一个物理分区
  • 重新启动VS2017
  • 减少MSI Afterburner中的GPU和内存时钟
  • 检查显卡VRAM使用情况
  • 关闭后台应用程序

我的电脑

如果这些信息对某人有帮助,请点击这里:

  • Intel©Core©i5-6600K @ 3,5GHz
  • EVGA GeForce GTX 1060 6GB GDDR5
  • MSI Z170-A PRO
  • 2x8GB DDR4-2133
  • Thermaltake 530W PSU
  • RAID1中的2x1TB硬盘(项目上有)
  • 128GB SSD
  • 512GB HDD

提前致谢, 利亚

1 个答案:

答案 0 :(得分:2)

您的所有“问题排查”步骤都是伏都教。你使用哪个IDE无关紧要(无论如何它只是一个美化的编辑器)。在您的可执行文件驻留在文件系统中的哪个位置并不重要(它只是具有映射到操作系统的页面的存储设备块)。如果遇到热问题,降低GPU和/或内存时钟有助于稳定性,但不会影响这种蠕变性能问题(如果出现散热问题,您会在几分钟内注意到,而不是几小时)。

系统运行一段时间后性能突然下降几乎总是归因于资源耗尽,迫使系统交换数据。资源耗尽的原因是分配管理不当,即分配和再次释放之间的不平衡。

这是你必须调试的。对于OpenGL,每个glGen… / glCreate…必须由匹配的glDelete…进行平衡。对于代码中new的每次使用,都必须保持平衡delete(对于new …[],必须有delete[] …

如果您将对象推入容器(如std::vectorstd::liststd::map等),请确保您还执行垃圾,即丢弃不再使用的对象