OpenGL - 超出 gpu 内存,可能的情况
OpenGL - gpu memory exceeded, possible scenarios
我可以使用 glTexImage2D
或 glBufferData
将一些数据发送到 gpu 内存。假设我请求驱动程序向 gpu 发送更多数据,但 gpu 内存已经满了。我大概得到GL_OUT_OF_MEMORY。渲染线程可能会发生什么?可能的情况是什么?是否有可能终止渲染线程?
这取决于实际的 OpenGL 实现。但最有可能的情况是,你会遇到严重的性能下降,但一切都会继续工作。
OpenGL 使用抽象内存模型,实际实现威胁到 GPU 自己的内存作为缓存。事实上,对于大多数 OpenGL 实现,当您加载纹理数据时,它一开始甚至不会直接进入 GPU。只有当渲染确实需要它时,它才会加载到 GPU RAM 中。如果使用的纹理多于 GPU RAM 的容量,则会根据需要从 GPU RAM 换入和换出纹理以完成渲染。
老一代的 GPU 需要纹理完全适合他们的 RAM。 2012 年之后推出的 GPU 实际上可以根据需要从主机内存中访问纹理子集,从而解除了这一限制。事实上,您更早 运行 进入最大纹理尺寸限制,而不是内存限制 (BT;DT)。
当然,其他不太完善的 OpenGL 实现可能会因内存不足错误而退出。但至少对于 AMD 和 NVidia 这不是问题。
我可以使用 glTexImage2D
或 glBufferData
将一些数据发送到 gpu 内存。假设我请求驱动程序向 gpu 发送更多数据,但 gpu 内存已经满了。我大概得到GL_OUT_OF_MEMORY。渲染线程可能会发生什么?可能的情况是什么?是否有可能终止渲染线程?
这取决于实际的 OpenGL 实现。但最有可能的情况是,你会遇到严重的性能下降,但一切都会继续工作。
OpenGL 使用抽象内存模型,实际实现威胁到 GPU 自己的内存作为缓存。事实上,对于大多数 OpenGL 实现,当您加载纹理数据时,它一开始甚至不会直接进入 GPU。只有当渲染确实需要它时,它才会加载到 GPU RAM 中。如果使用的纹理多于 GPU RAM 的容量,则会根据需要从 GPU RAM 换入和换出纹理以完成渲染。
老一代的 GPU 需要纹理完全适合他们的 RAM。 2012 年之后推出的 GPU 实际上可以根据需要从主机内存中访问纹理子集,从而解除了这一限制。事实上,您更早 运行 进入最大纹理尺寸限制,而不是内存限制 (BT;DT)。
当然,其他不太完善的 OpenGL 实现可能会因内存不足错误而退出。但至少对于 AMD 和 NVidia 这不是问题。