我正在使用Nvidia 290.10 64位驱动程序来开发基于Linux的c++ OpenGL应用程序。我正在尝试减少其内存占用量,因为它利用了大量实时数据。

我一直在使用valgrind/massif来分析堆使用情况,尽管它可以帮助我优化各种事情,但到目前为止,使用的最大堆内存块是由libGL分配的。无论如何设置阈值,massif都不会让我详细了解这些分配来自何处,而仅仅是libGL。在高峰时期,我看到libGL分配了大约250MB(900MB的总堆使用量中)。我在显卡上拥有与VBO和纹理类似的内存量(主要是一个大的4096 * 4096纹理)。

因此,看起来好像libGL在堆上分配的内存量与我上传到GPU内存的内存量相似。当VBO的数量达到峰值时,libGL分配也达到峰值。那是正常的吗?我认为拥有大量GPU内存的好处之一是可以使RAM保持空闲状态?

最佳答案

您所经历的是完全正常的,因为出于各种原因,OpenGL实现必须在系统内存中保留数据的拷贝。

在OpenGL中,没有对GPU的专有访问权,因此,根据其用途,可能有必要交换数据(或仅从GPU内存中释放一些对象)。此外,GPU可能会崩溃,驱动程序随后会在无提示的情况下静默重置它们。这也需要所有缓冲区数据的完整拷贝。

并且不要忘记,地址空间分配(Valgrind报告的值)与实际内存利用率之间存在重大差异。

08-06 14:21