如何在 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 使用的总内存(以字节为单位)?的主要内容,如果未能解决你的问题,请参考以下文章