如果你怎么办malloc
返回 NULL 或new
抛出异常?对于这种可能性,您有恢复途径吗?
大多数应用程序都没有。大多数应用程序愉快地假设malloc
永远不会返回 NULL 和/或new
永远不会扔。如果这些操作失败,它们就会很高兴地崩溃。
OpenGL 通常也是如此。您可能有充分的理由要求特定的内存大小;因为你需要它。如果您无法获得它,无论出于何种原因,通常都没有解决方案。
虽然在某些情况下您可以从无法分配内存的情况中恢复,但 OpenGL 以另一种方式让您感到困惑。
看,在 OUT_OF_MEMORY 错误上未定义 OpenGL 的整个状态的原因是:OOM 可能发生在anywhere。没有函数的文档声称它会发出 OOM 错误,因为每个功能可以发出这样的错误。
当您调用分配函数时,内存(不一定)不会被分配。驱动程序可以(并且几乎肯定会)将分配推迟到以后。因此,在驱动程序检测到 OOM 条件后,您调用的任何 OpenGL 函数都会出现 OOM 错误。
因此,如果缓冲区分配失败,则 longafter打电话给glBufferData
导致失败的原因,OpenGL 规范对当前状态有何说明?仅从 OOM 错误来看,无法准确追踪导致该错误的原因。
因此,如果您收到此错误,则实际上不可能进行恢复。您唯一真正的办法是终止应用程序或重建它。
请注意,当您尝试分配内存但无法分配内存时,Vulkan 或 D3D12 等较低级别的 API 将立即 OOM。
Also:
但另一方面,API 似乎没有提供任何方法来检查发送特定大小的数据是否会成功。
那解决不了任何问题。为什么?
因为你的应用程序没有own图形处理器;你的操作系统可以。多个程序可以同时在GPU上分配内存。操作系统也可以浏览内存,根据需要将内容分页进出内存。
因此,如果您询问分配是否会成功,并且 OpenGL 返回“是”,那么当您实际执行该分配时,答案可能是changed.
这也是为什么 Vulkan 和类似的 API 没有测试分配是否成功的函数(也没有测试还有多少内存未分配的函数)。您只需分配内存即可;要么它成功了,你就恢复了记忆,要么它失败了,你就失去了记忆。