确定可用的视频内存

kam*_*iro 16 memory opengl

在开发OpenGL程序时,是否有办法从系统中进行轮询以找出可用于存储纹理的数兆字节等?

或者这些日子的标准方法是分配内存而忘记一切?

Dam*_*mon 43

虽然官方的立场仍然是"你不需要知道,你不想知道,但它无论如何也无济于事",幸运的是至少有两个IHV最近表现出更多的洞察力,并提供查询信息的扩展:

关于这些扩展的一个好处是它们具有最小公分母,这正是大多数人所需要的,并且您不需要查询扩展支持或执行任何特殊操作,因为它们都可以通过glGetIntegerv.

在最简单的情况下,您可以将4个整数的数组初始化为零(或者在扩展不起作用的情况下,您将假设的某个最小默认值),然后调用glGetIntegerv两次(分别使用GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVXTEXTURE_FREE_MEMORY_ATI),最后调用glGetError以清除错误状态.glGetIntegerv如果指向内存失败,它不会修改它,也不会崩溃或任何其他坏事 - 它只是将错误状态设置为GL_INVALID_ENUM.

两个扩展都在第一个数组位置返回一个值,ATI也返回另一个值中的一些值.

nb:glAreTexturesResident在主流硬件上已经有近十年没有得到支持,就像纹理优先级一样.常见的口头禅是驱动程序作者无论如何都比你更了解.

  • 无论如何,你真的不需要"支持"扩展.如上所述,他们使用`glGetIntegerv` - 只使用常量(在spec文件中).它会起作用,或者不起作用.选择一个合理的默认值,这是你能得到的最好的. (2认同)
  • 已经很长一段时间了,但目前仍在为nVidia Titan工作.非常有用,谢谢! (2认同)

dat*_*olf 14

OpenGL不会向您提供此信息.坦率地说:只有少数好处,因为今天我们拥有多任务操作系统.如果有需要,OpenGL驱动程序负责将纹理数据交换到系统内存或从系统内存交换.

如果您上传的纹理仍然驻留在快速内存中,OpenGL可以为您做什么.该函数称为"glAreTexturesResident".您可以使用它逐渐将内容上传到GPU,直到您填满GPU的内存.但请记住,您不是GPU的唯一用户.

  • 只需将其添加到此处,以便其他访问此处的人知道:`glAreTexturesResident`在核心配置文件中已弃用,因此在现代OpenGL程序中使用它们并不谨慎. (8认同)