pho*_*olz 5 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免费吗?
您经历的是完全正常的,因为OpenGL实现必须出于各种原因在系统内存中保留数据的副本.
在OpenGL中,没有对GPU的独占访问权限,因此根据其使用情况,可能需要更换数据(或者只是从GPU内存中释放一些对象).此外,GPU可能会崩溃,然后驱动程序会在没有用户注意的情况下静默重置它们.这也需要所有缓冲区数据的完整副本.
并且不要忘记地址空间分配(Valgrind报告的值)与实际内存利用率之间存在重大差异.