Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libGL堆使用 我正在使用基于Linux的C++ OpenGL应用程序,利用英伟达290.10 64位驱动程序。我正试图减少它的内存占用,因为它使用了相当多的实时数据_C++_Linux_Opengl_Heap_Valgrind - Fatal编程技术网

libGL堆使用 我正在使用基于Linux的C++ OpenGL应用程序,利用英伟达290.10 64位驱动程序。我正试图减少它的内存占用,因为它使用了相当多的实时数据

libGL堆使用 我正在使用基于Linux的C++ OpenGL应用程序,利用英伟达290.10 64位驱动程序。我正试图减少它的内存占用,因为它使用了相当多的实时数据,c++,linux,opengl,heap,valgrind,C++,Linux,Opengl,Heap,Valgrind,我一直在使用valgrind/massif分析堆的使用情况,虽然它帮助我优化了各种事情,但到目前为止,使用的堆内存中最大的一块是由libGL分配的。无论我如何设置阈值,massif都不会让我详细了解这些分配的来源,只是它是libGL。在高峰时期,我看到libGL分配了大约250MB(在900MB的总堆使用量中)。我在图形卡上拥有与VBO和纹理(大多数是一个大的4096*4096纹理)相似的内存量 因此,看起来好像libGL在堆上分配了与我上传到GPU内存相似的内存量。当VBO数量达到峰值时,li

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


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

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

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


别忘了地址空间分配(Valgrind报告的值)和实际内存利用率之间有很大的区别。

您在
glBufferData
中为VBO指定了什么用途?对于大部分VBO,它是GL\u STATIC\u DRAW。在一种情况下,它是GL_STREAM_DRAW,但即使应用程序的这一部分被禁用,其行为也是相同的。@KillianDS并不重要,因为用法只是一个提示,不是强制性的。由于各种原因,OpenGL必须保留一份副本。谢谢,我怀疑可能是这样的。现在,当RAM被填满时,只要大部分的分配来自libGL,这不是件坏事吗?pholz:嗯,libGL正是进行分配的代码的来源,但是内存是由分配OpenGL资源的进程有效地分配的。对于系统来说,两者之间没有区别。现代操作系统也不区分RAM和存储。对他们来说,只有“内存”,RAM只是另一个缓存级别。有关现代内存使用的非常好的介绍,请参阅本文