当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在glBufferData期间处理GL_OUT_OF_MEMORY错误?》经验,为你挑选了1个好方法。

OpenGL参考提到了GL_OUT_OF_MEMORY错误

记录此错误后,GL的状态未定义,错误标志的状态除外.

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

这种情况真的无望吗?如果我收到这个错误,那么我唯一能够重新创建整个OpenGL上下文并重新开始吗?



1> Nicol Bolas..:

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

大多数应用程序没有.大多数应用程序都乐于假设malloc永远不会返回NULL和/或new永远不会抛出.如果这些操作失败,他们将很快崩溃.

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

虽然有些情况下您可以从无法分配内存中恢复,但OpenGL会以另一种方式使您感到困惑.

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

调用分配函数时,不一定(必须)分配内存.司机可以(并且几乎肯定会)将分配推迟到以后.因此,在驱动程序检测到OOM条件后,您从调用的任何OpenGL函数中获得OOM错误.

因此,如果缓冲区分配失败,调用glBufferData该错误之后很久就会引发失败,那么OpenGL规范可以对当前状态做些什么呢?仅从OOM错误中,无法确切地追踪导致它的原因.

因此,如果您收到此错误,则无法恢复.您唯一真正的办法是终止申请或重建申请.

请注意,当您尝试分配内存时,Vulkan或D3D12等较低级别的API会立即显示OOM,而不能.

也:

但另一方面,API似乎没有提供任何方法来检查发送特定大小的数据是否会成功.

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

因为您的应用程序不拥有 GPU; 你的操作系统.多个程序可以同时在GPU上分配内存.操作系统也可以通过内存进行调整,在内存中分配内容和内存.

因此,如果您询问分配是否成功,并且OpenGL返回是,则在您实际执行该分配时,答案可能已更改.

这也是为什么Vulkan和类似的API没有测试分配是否成功的功能的原因(也没有测试未分配多少内存的功能).你只需分配内存; 无论是有效还是你得到你的记忆,或者它失败而你却没有.


很好的答案.我只想投入,如果你可以确保回滚和清理不涉及额外的内存分配尝试,那么考虑到仔细的应用程序设计,可以从这种内存不足的情况中恢复.一旦可以回溯到可以重新分配的点,任何人都可以尝试.此外,新的低级API对于嵌入式和高可用性开发人员来说也是天赐之物.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有