确定可用视频内存

21

在开发OpenGL程序时,是否有一种方式可以从系统中轮询以了解可用于存储纹理等的兆字节数量?

或者现在的标准方法是分配内存并忘记其他?

2个回答

54

尽管官方立场仍然是“你不需要知道,你也不想知道,而且这也帮不了你”,但幸运的是至少有两个 IHV 最近表现出了更多见解,并提供了扩展查询信息:

这些扩展的一个好处是它们具有最常见的公共分母,这正是大多数人所需要的,而且无需查询扩展支持或做任何特殊处理,因为它们都通过 glGetIntegerv 工作。

在最简单的情况下,您只需将 4 个整数的数组初始化为零(或者一些默认的最小值,以防扩展不起作用),然后使用 GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVXTEXTURE_FREE_MEMORY_ATI 分别调用两次 glGetIntegerv,最后调用 glGetError 清除错误状态。如果失败,glGetIntegerv 不会修改指向的内存,也不会崩溃或发生其他不良情况,它仅仅会将错误状态设置为 GL_INVALID_ENUM

这两个扩展都在第一个数组位置返回一个值,ATI 的一个扩展还返回其他 3 个值。

注意:glAreTexturesResident 在主流硬件上已经不支持将近十年了,就像纹理优先级一样。普遍的观点是,驱动程序编写者比你知道得更多。


我没有使用JOGL,所以我不知道,但是在GL2和GL3接口的文档中至少有一个合理的解释:“支持在此规范制定时定义的大多数扩展”。这意味着分别为2004年9月和2008年8月,不包括上述两个扩展(2009年3月和12月)。因此,如果您使用这两个接口之一,那将是一个合理的解释(另一个可能是您的图形驱动程序确实不支持这些扩展)。 - Damon
3
无论如何,您实际上并不需要扩展的“支持”。如上所述,它们使用glGetIntegerv--只需使用常量(这些常量在规范文件中),它将起作用或者不起作用。选择一个合理的默认值,这就是您能得到的最好结果。 - Damon
没错,你是对的,只需传递十六进制值即可运行..谢谢Damon,点个赞。 - elect
2
已经过了很长时间,但它仍然可以在一台nVidia Titan上运行。非常有用,谢谢! - Ruud van Gaal
对于 Mesa @ GLX,还有 GLX_MESA_query_renderer - Ruslan

13

OpenGL无法提供这些信息。而且说实话:这样做并没有太多好处,因为现在我们有了多任务操作系统。如果有需求,OpenGL驱动程序会负责将纹理数据交换到/从系统内存中。

OpenGL可以告诉您的是,您上传的纹理是否仍然驻留在快速内存中。该函数称为“glAreTexturesResident”。您可以使用它逐步将东西上传到GPU,直到填满GPU的内存。但请记住,您并不是GPU的唯一用户。


13
将其添加在此,以便访问此处的其他人会知道:在核心版本中已弃用glAreTexturesResident,因此在现代OpenGL程序中使用它们并不明智。 - legends2k

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