libGL堆使用情况

时间:2012-05-22 08:06:35

标签: c++ linux opengl heap valgrind

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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