在开发OpenGL程序时,有没有办法从系统中进行轮询以找出可用于存储纹理的数兆字节等?
或者现在标准方法是分配内存而忘记一切?
答案 0 :(得分:42)
虽然官方的立场仍然是“你不需要知道,但你不想知道,反正它也无济于事”,幸运的是至少有两个IHV最近表现出了更多的洞察力并提供了扩展查询该信息:
这些扩展的一个好处是,它们具有最不常见的分母,这正是大多数人所需要的,并且您不需要查询扩展支持或做任何特殊的事情,因为它们都通过glGetIntegerv
工作
在最简单的情况下,您可以将4个整数的数组初始化为零(或者如果扩展不起作用,您可以假设一些最小默认值),然后两次调用glGetIntegerv
(分别使用GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
和TEXTURE_FREE_MEMORY_ATI
,最后调用glGetError
来清除错误状态。如果指向内存失败,glGetIntegerv
不会修改指向内存,也不会崩溃或任何其他坏事 - 它只是将错误状态设置为GL_INVALID_ENUM
。
两个扩展都返回第一个数组位置的值,ATI也返回另一个数值中的值。
n.b。:glAreTexturesResident
近十年未在主流硬件上得到支持,与纹理优先级相同。常见的口头禅是,无论如何,司机作家都比你更了解。
答案 1 :(得分:13)
OpenGL没有提供这些信息。坦率地说:只有少数好处,因为今天我们拥有多任务操作系统。如果有需要,OpenGL驱动程序负责将纹理数据交换到系统内存或从系统内存交换。
如果您上传的纹理仍然驻留在快速内存中,OpenGL可以为您做什么。该函数称为“glAreTexturesResident”。您可以使用它逐渐将内容上传到GPU,直到您填满GPU的内存。但请记住,您不是GPU的唯一用户。