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

9

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

我正在构建一个OpenGL应用程序,总使用内存似乎在增加,我可以获得自己创建的变量和对象所使用的总内存信息,但无法保证OpenGL用于其变量、对象和纹理等的内存量。因此,是否可能在C++中获取OpenGL使用的总内存量(以字节为单位)

1个回答

9
一般来说,你做不到。OpenGL最终是硬件抽象层。而OpenGL并没有提供获取这种信息的方法。有一些供应商特定的扩展可以提供查询方式,但你得到的内容取决于架构。AMD硬件提供ATI_meminfo扩展。它将内存分解为对象类型:缓冲区对象、纹理和渲染缓冲区。NVIDIA提供实验性的扩展NVX_gpu_memory_info。关于如何使用它,注册表中没有任何信息,所以我无法为你提供链接。无论如何,了解GPU正在使用的最有效方法是自己跟踪。始终使用带有大小的内部图像格式;这意味着你可以计算出纹理占用多少内存的相当准确的估计值。对于缓冲区对象等也一样。你不会得到精确的数字,因为填充、对齐等可能会使你混淆。但你会得到相当不错的结果。

我认为纹理mipmap也应该考虑在内,以计算内存使用统计信息。 - Luca
+1 很好的答案。实际上我之所以没有回答这个问题,是因为我有印象OP想知道OpenGL实现(驱动程序)使用的CPU内存。否则(如果指的是GPU内存),我不知道他应该如何看到“总内存使用似乎在增加”。 - Christian Rau
我正在使用mipmaps,这应该比使用位图纹理多占用50%的内存。但是GL似乎同时使用RAM和Video RAM。 - jondinham
2
@Paul:一个使用了 mipmaps 的纹理占用的空间只有没有使用 mipmaps 的纹理的 ~33%(除非它是一维或三维纹理)。 - Nicol Bolas
1
1D 占 50%,2D 占 33%,3D 占 25%。 - Macke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接