在开发OpenGL程序时,是否有一种方式可以从系统中轮询以了解可用于存储纹理等的兆字节数量?
或者现在的标准方法是分配内存并忘记其他?
尽管官方立场仍然是“你不需要知道,你也不想知道,而且这也帮不了你”,但幸运的是至少有两个 IHV 最近表现出了更多见解,并提供了扩展查询信息:
这些扩展的一个好处是它们具有最常见的公共分母,这正是大多数人所需要的,而且无需查询扩展支持或做任何特殊处理,因为它们都通过 glGetIntegerv
工作。
在最简单的情况下,您只需将 4 个整数的数组初始化为零(或者一些默认的最小值,以防扩展不起作用),然后使用 GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
和 TEXTURE_FREE_MEMORY_ATI
分别调用两次 glGetIntegerv
,最后调用 glGetError
清除错误状态。如果失败,glGetIntegerv
不会修改指向的内存,也不会崩溃或发生其他不良情况,它仅仅会将错误状态设置为 GL_INVALID_ENUM
。
这两个扩展都在第一个数组位置返回一个值,ATI 的一个扩展还返回其他 3 个值。
注意:glAreTexturesResident
在主流硬件上已经不支持将近十年了,就像纹理优先级一样。普遍的观点是,驱动程序编写者比你知道得更多。
OpenGL无法提供这些信息。而且说实话:这样做并没有太多好处,因为现在我们有了多任务操作系统。如果有需求,OpenGL驱动程序会负责将纹理数据交换到/从系统内存中。
OpenGL可以告诉您的是,您上传的纹理是否仍然驻留在快速内存中。该函数称为“glAreTexturesResident”。您可以使用它逐步将东西上传到GPU,直到填满GPU的内存。但请记住,您并不是GPU的唯一用户。
glAreTexturesResident
,因此在现代OpenGL程序中使用它们并不明智。 - legends2k
glGetIntegerv
--只需使用常量(这些常量在规范文件中),它将起作用或者不起作用。选择一个合理的默认值,这就是您能得到的最好结果。 - Damon