libGL堆使用情况

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免费吗?

dat*_*olf 7

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

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

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

  • pholz:嗯,libGL就是执行分配的代码来自的地方,但内存是由分配OpenGL资源的进程有效分配的.对于系统而言,两者之间没有区别.现代操作系统也不区分RAM和存储.对于他们来说,只有"内存"而RAM只是另一个缓存级别.有关现代内存使用的非常好的介绍,请参阅此文章https://www.varnish-cache.org/trac/wiki/ArchitectNotes (2认同)