【发布时间】:2026-02-01 01:10:02
【问题描述】:
我可以使用glTexImage2D 或glBufferData 将一些数据发送到gpu 内存。假设我请求驱动程序向 gpu 发送更多数据,但 gpu 内存已满。我可能会得到 GL_OUT_OF_MEMORY。渲染线程会发生什么?有哪些可能的情况?渲染线程会不会被终止?
【问题讨论】:
标签: c++ opengl memory-management glsl
我可以使用glTexImage2D 或glBufferData 将一些数据发送到gpu 内存。假设我请求驱动程序向 gpu 发送更多数据,但 gpu 内存已满。我可能会得到 GL_OUT_OF_MEMORY。渲染线程会发生什么?有哪些可能的情况?渲染线程会不会被终止?
【问题讨论】:
标签: c++ opengl memory-management glsl
这取决于实际的 OpenGL 实现。但最有可能的情况是,您只会遇到严重的性能下降,但一切都会继续工作。
OpenGL 使用抽象内存模型,实际实现威胁到 GPU 自己的内存作为缓存。事实上,对于大多数 OpenGL 实现,当您加载纹理数据时,它甚至不会直接进入 GPU。只有在实际需要渲染时才会将其加载到 GPU RAM 中。如果使用的纹理多于 GPU RAM 的容量,则纹理会根据需要从 GPU RAM 换入和换出以完成渲染。
纹理完全适合其 RAM 需要较旧的 GPU 代。 2012 年之后出现的 GPU 实际上可以根据需要从主机内存访问纹理子集,从而解除了这一限制。事实上,您很快就会遇到最大纹理尺寸限制,而不是内存限制 (BT;DT)。
当然,其他开发不太完善的 OpenGL 实现可能会出现内存不足错误。但至少对于 AMD 和 NVidia 来说,这不是问题。
【讨论】: