5

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

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

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

4

1 回答 1

7

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

在 OpenGL 中,没有对 GPU 的独占访问权限,因此根据其使用情况,可能需要交换数据(或仅从 GPU 内存中释放一些对象)。此外,GPU 可能会崩溃,然后驱动程序会在用户没有注意到的情况下默默地重置它们。这也需要所有缓冲区数据的完整副本。

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

于 2012-05-22T09:49:15.260 回答