如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?

Posted

技术标签:

【中文标题】如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?【英文标题】:How to get total memory in bytes used by OpenGL in C++? 【发布时间】:2011-11-30 07:44:01 【问题描述】:

我正在构建一个 OpenGL 应用程序,使用的总内存似乎在增加,我可以获得有关我自己创建的变量和对象使用的总内存的信息,但不能保证 OpenGL 使用了多少内存变量、对象和纹理等。那么是否有可能获得 OpenGL 在 C++ 中使用的总内存(以字节为单位)?

【问题讨论】:

【参考方案1】:

一般来说,你不会。 OpenGL 最终是一种硬件抽象。而 OpenGL 根本不提供获取此类信息的方法。

有一些特定于供应商的扩展可以让您提出问题,但您得到的结果取决于架构。 AMD 硬件提供ATI_meminfo extension。它将内存分解为对象类型:缓冲区对象、纹理和渲染缓冲区。

NVIDIA 提供了实验性扩展 NVX_gpu_memory_info。注册表中没有关于如何使用它的信息,所以我无法将您链接到任何内容。

无论如何,了解 GPU 正在使用什么的最有效方法就是自己跟踪它。始终使用internal image formats with sizes;这意味着您可以很好地估计纹理占用的内存量。缓冲区对象等也是如此。

您不会得到确切的数字,因为填充、对齐等可能会让您感到困惑。但你会得到相当不错的东西。

【讨论】:

我认为纹理mipmaps也应该考虑到内存使用统计。 +1 好答案。我实际上没有回答这个问题,因为我的印象是 OP 想知道 OpenGL 实现(驱动程序)使用的 CPU 内存。否则(如果指的是 GPU 内存)我不知道他应该如何看到“使用的总内存似乎在上升”。 我正在使用 mipmap,这应该比使用位图纹理多占用 50% 的内存。但 GL 似乎同时使用 RAM 和 Video RAM @Paul:mipmapped 纹理占用的纹理大约是没有 mipmap 的纹理的 33%(除非它是 1D 或 3D 纹理)。 1D 为 50%,2D 为 33%,3D 为 25%。

以上是关于如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Posix 系统中的总可用磁盘空间?

使用c ++单击OpenGL窗口时如何获取世界坐标

如何在 C++ 中获取 Windows 下的内存使用情况

如何获得Windows Server 2008 R2中的总虚拟内存

如何在visual c++中使用OpenGL

如何使用 OpenGL 和 GLSL 改变颜色(C++)?