【问题标题】:OpenGL - gpu memory exceeded, possible scenariosOpenGL - 超出 gpu 内存,可能的情况
【发布时间】:2026-02-01 01:10:02
【问题描述】:

我可以使用glTexImage2DglBufferData 将一些数据发送到gpu 内存。假设我请求驱动程序向 gpu 发送更多数据,但 gpu 内存已满。我可能会得到 GL_OUT_OF_MEMORY。渲染线程会发生什么?有哪些可能的情况?渲染线程会不会被终止?

【问题讨论】:

    标签: c++ opengl memory-management glsl


    【解决方案1】:

    这取决于实际的 OpenGL 实现。但最有可能的情况是,您只会遇到严重的性能下降,但一切都会继续工作。

    OpenGL 使用抽象内存模型,实际实现威胁到 GPU 自己的内存作为缓存。事实上,对于大多数 OpenGL 实现,当您加载纹理数据时,它甚至不会直接进入 GPU。只有在实际需要渲染时才会将其加载到 GPU RAM 中。如果使用的纹理多于 GPU RAM 的容量,则纹理会根据需要从 GPU RAM 换入和换出以完成渲染。

    纹理完全适合其 RAM 需要较旧的 GPU 代。 2012 年之后出现的 GPU 实际上可以根据需要从主机内存访问纹理子集,从而解除了这一限制。事实上,您很快就会遇到最大纹理尺寸限制,而不是内存限制 (BT;DT)。

    当然,其他开发不太完善的 OpenGL 实现可能会出现内存不足错误。但至少对于 AMD 和 NVidia 来说,这不是问题。

    【讨论】:

    • 驱动程序可以保存比 GPU 内存中存储的更多的数据。驱动程序缓冲区是否可能会增长,直到主机内存可用?
    • @Irbis:确实是这样。事实上,一旦主机系统的 RAM 用完,但配置了交换空间,就会使用交换空间。不幸的是,无法在 OpenGL 对象的数据和块存储之间显式创建连接(将某些文件的内容映射为纹理图像并将该指针传递给图形 API 以按需使用);希望这将是 Vulkan 的可能性(使用主机管理的缓冲区和数据描述符)。
    最近更新 更多