libGL 堆使用

Posted

技术标签:

【中文标题】libGL 堆使用【英文标题】:libGL heap usage 【发布时间】:2012-05-22 08:06:34 【问题描述】:

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

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

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

【问题讨论】:

你为glBufferData中的VBO指定了什么用法? 对于大部分 VBO,它是 GL_STATIC_DRAW。在一种情况下,它是 GL_STREAM_DRAW,但即使应用程序的这部分被禁用,其行为也是相同的。 @KillianDS 无关紧要,因为使用只是一个提示,不是强制性的。此外,出于各种原因,OpenGL 必须保留一份副本。 【参考方案1】:

您的体验完全正常,因为 OpenGL 实现出于各种原因必须在系统内存中保留一份数据。

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

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

【讨论】:

谢谢,我怀疑它可能是这样的。现在,当 RAM 被填满时,只要大部分分配来自 libGL,这不是一件坏事吗? pholz:好吧,libGL 只是执行分配的代码的来源,但内存是由分配 OpenGL 资源的进程有效分配的。对于系统而言,两者之间没有区别。现代操作系统也不区分 RAM 和存储。对他们来说,只有“内存”,而 RAM 只是另一个缓存级别。有关现代内存使用的非常好的介绍,请参阅这篇文章varnish-cache.org/trac/wiki/ArchitectNotes

以上是关于libGL 堆使用的主要内容,如果未能解决你的问题,请参考以下文章

Fedora 19 使用 rpmfussion 的 NVIDIA 驱动程序:libGL 错误:加载驱动程序失败:swrast

模拟器无法加载“libGLES_emulation”驱动程序

我无法使用 opencv2 并收到 ImportError: libgl.so.1 cannot open shared object file no such file or directory

android studio emulator libGl错误

Azure 上的 Flask APP 给出 import cv2 ImportError: libGL.so.1: after deployment

Android JNI中使用了libOpenCL.so,依赖libGLES_mali.so,但是link时出错