gpt4 book ai didi

opengl - 如何在 glBufferData 期间处理 GL_OUT_OF_MEMORY 错误?

转载 作者:行者123 更新时间:2023-12-04 21:51:33 25 4
gpt4 key购买 nike

OpenGL 引用提到了 GL_OUT_OF_MEMORY错误

The state of the GL is undefined, except for the state of the error flags, after this error is recorded.



函数 glBufferData如果无法消化给定的数据,则可能会产生此错误。但另一方面,API 似乎没有提供任何方法来检查发送特定大小的数据是否会成功。

这种情况真的没有希望了吗?如果我收到这个错误,是我唯一需要重新创建整个 OpenGL 上下文并重新开始的吗?

最佳答案

如果 malloc 你会怎么做返回 NULL 或 new抛出异常?你有这种可能性的恢复途径吗?

大多数应用程序没有。大多数应用程序愉快地假设 malloc永远不会返回 NULL 和/或那个 new永远不会扔。如果这些操作失败,他们会很高兴地崩溃。

OpenGL 通常也是如此。您可能有充分的理由要求特定的内存大小;因为你需要它。如果您无法获得它,无论出于何种原因,通常都没有解决方案。

虽然在某些情况下您可以从无法分配内存中恢复过来,但 OpenGL 以另一种方式让您感到困惑。

看,在 OUT_OF_MEMORY 错误上未定义 OpenGL 的整个状态的原因是:OOM 可以在任何地方发生。没有函数的文档声称它可以发出 OOM 错误,因为每个函数都可以发出这样的错误。

当您调用分配函数时,不会(必须)分配内存。驱动程序可以(并且几乎肯定会)将分配推迟到以后。因此,在驱动程序检测到 OOM 条件后,您调用的任何 OpenGL 函数都会出现 OOM 错误。

因此,如果缓冲区分配失败,在调用 glBufferData 很久之后引发了失败,OpenGL 规范对当前状态有什么看法?仅从 OOM 错误,无法准确追踪导致它的原因。

因此,如果出现此错误,则无法真正恢复。您唯一真正的办法是终止应用程序或重建它。

请注意,当您尝试分配内存时,像 Vulkan 或 D3D12 这样的低级 API 会立即 OOM 而不能。

还:

But on the other hand the API doesn't seem to provide any way to check if sending data of particular size would succeed.



那什么都解决不了。为什么?

因为您的应用程序不拥有 GPU;你的操作系统可以。多个程序可以同时在 GPU 上分配内存。操作系统也可以使用内存,在它认为合适的时候将内容分页进出内存。

因此,如果您询问分配是否会成功,而 OpenGL 返回 yes,那么当您实际执行该分配时,答案可能已经改变。

这也是为什么 Vulkan 和类似的 API 没有测试分配是否成功的功能(也没有测试有多少内存未分配的功能)。您只需分配内存;要么它工作,你得到你的内存,要么它失败,你没有。

关于opengl - 如何在 glBufferData 期间处理 GL_OUT_OF_MEMORY 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34204537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com