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

2023-12-05

OpenGL 参考文献提到了GL_OUT_OF_MEMORY error

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

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

这种情况真的没有希望了吗?如果出现此错误,我是否只能重新创建整个 OpenGL 上下文并重新开始?


如果你怎么办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 没有测试分配是否成功的函数(也没有测试还有多少内存未分配的函数)。您只需分配内存即可;要么它成功了,你就恢复了记忆,要么它失败了,你就失去了记忆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理glBufferData期间的GL_OUT_OF_MEMORY错误? 的相关文章

  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • 在 2D 纹理上绘制的红色矩形在绘制后立即消失

    跟随我的另一个问题 https stackoverflow com questions 18477291 render an outlined red rectangle on top a 2d texture in opengl 1847
  • 三角形纹理映射OpenGL

    我正在开发一个使用 Marching Cubes 算法并将数据更改为 3D 模型的项目 现在我想在 OpenGL 中为我的 3D 模型使用纹理映射 我首先尝试了一个简单的示例 它将图片映射到三角形上 这是我的代码 int DrawGLSce
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提
  • 如何使用边缘和内部镶嵌因子完成三角形面片镶嵌?

    I am just learning tessellation and i came across with below example for triangle patch tessellation but i am not sure h
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 编译 GLUI 库,VS2010 给我一个奇怪的命名空间错误

    我有一个针对我所在班级的 OpenGL 项目 它基于 GLUI 提供的 GLUI 库无法工作 这就是我尝试自己编译它的原因 因此 我从 SourceForge 下载了源代码并尝试编译 glui 库 它给了我这个 但我找不到任何相关信息 1
  • 如何在 Visual Studio 2012 中安装 GLUT 和 OpenGL?

    我今天刚安装了Visual Studio 2012 我想知道如何在该平台上安装GLUT和OpenGL OpenGL 应该已经存在 可能会缺少 Freeglut GLUT GLUT 现在已经非常过时并且没有得到积极的支持 所以你当然应该使用
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 帧缓冲区/颜色缓冲区?

    有人可以指出我两者是否相同吗 我的意思是我一直在阅读有关它的信息 这里的红皮书说 颜色缓冲区本身可以由多个子缓冲区组成 系统上的帧缓冲区包含所有这些缓冲区 here http glprogramming com red chapter10
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点

随机推荐

  • 在Java中,为什么 ((A)b).disp() 调用派生类方法 disp() 而不是基类方法 disp() ?

    我正在学习 Java 是一个初学者 请帮我找出为什么这不起作用 在下面的程序中 我的目标是从主方法调用基类方法 而不在派生类方法中使用 super 关键字 如代码所示 main方法中的 A b num 工作得很好 并且按预期输出 100 但
  • Android 全文搜索和 ListAdapter

    我已经有一个使用 SQLite 数据库和列表适配器的应用程序 我正在尝试更新我的应用程序以使用全文搜索功能 但正在努力寻找问题的答案 基本上 当我使用必要的 id 列创建虚拟表时 数据库会将其转换为文本字段 并且它不再是自动增量主键 我如何
  • 在python中将字符串日期转换为日期格式?

    如何在Python中将下面的字符串日期转换为日期格式 input date 15 MARCH 2015 expected output 2015 03 15 我尝试使用datetime strftime and datetime strpt
  • Python 中的常量究竟由什么构成?

    PEP 8 规定 that 常量通常在模块级别定义并写在所有模块中 大写字母用下划线分隔单词 例子包括MAX OVERFLOW and TOTAL 我知道这只是一个命名约定 但我很想知道是否有官方或广泛接受的定义来定义常量与半私有变量的实际
  • 将子进程的标准输出重定向到 2 个或更多子进程的标准输入

    基本上我想学习如何使用stdout of one subprocess say proc1 as stdin2 个或更多其他subprocesses say proc2 proc3 在Python中 你好 我需要zcat gz 文件并使用发
  • 带枚举的单例与带双重检查锁定的单例

    我想知道在多线程环境中实践中哪一个更好 我将 Singleton 理解为 Enum 类型在加载类时创建一个实例 除此之外我没有看到任何其他重要的东西 有什么优点和缺点吗 单例作为Enum type public enum Singleton
  • 如何分离由 subprocess.call 运行的程序?

    我正在使用 subprocess call 使用默认应用程序打开 pdf 文件 如下所示 subprocess call xdg open pdf stderr STDOUT 但是 当运行该进程时 该进程已附加到终端 我想将其分离 基本上
  • Windows 中是否有相当于 cron 的工具?

    我想知道是否有同等的cron在 Windows 中以及如何使用 PHP 以编程方式使用它 Windows 有Scheduled Tasks控制面板小程序 或更高版本的 Windows 上的管理控制台插件 但您也可以通过以下方式访问它scht
  • 防止应用程序升级时数据丢失

    我们开发了一款 Android 应用程序 并通过 MDM 移动设备管理 Soti Mobi 控制 推送新的安装和更新 发送的更新会静默升级应用程序 无需用户确认 因此 如果用户正在使用应用程序 应用程序会自动停止 升级并从头开始启动 因此用
  • grep (bash) 多行模式

    在 bash 4 3 46 1 中 我有一些多行所谓的 fasta 记录 其中每个记录都是由 gt name 和以下几行 DNA 序列 AGCTNacgtn 启动 这里有三个记录 gt chr1 AGCTACTTTT AGGGNGGTNN
  • 请求了 n 条推文,但 API 只能返回 0 错误

    我无法使用 R 中的 twitteR 包检索任何推文 例如此请求 nbahash tweets searchTwitter nba since 2013 01 01 until 2014 02 25 n 20 显示此警告消息 警告消息 在
  • 如何在 Dropbox API v2 中创建不过期令牌?

    正如标题所说 最近 Dropbox API 改版后 Token 开始有过期时间了 以前如果我不撤销的话 Token是可以永久使用的 也许出于安全原因添加了过期时间 然而 这对于我的应用来说非常不方便 我需要上传文件很长时间 可能一次超过一个
  • 使用另一个数组从数组中删除条目

    不知道该怎么做 所以非常感谢任何帮助 说我有 const array1 1 1 2 3 4 const array2 1 2 所需输出 const result 1 3 4 我想比较一下array1 and array2对于每个条目arra
  • 从 Zend Controller 插件中获取视图对象

    在我的控制器中 我有一个 postDispatch 来整合我的 FlashMessenger 消息 public function postDispatch messages this gt helper gt getHelper Flas
  • 在更新之前的代码签名证书后,如何在 Windows 10 中保留 SmartScreen 筛选器的声誉?

    我在过去 3 年里拥有代码签名证书 当我用它签署我的软件时 签名没有导致任何问题SmartScreen从 Internet 下载软件时出现警告 该证书本月到期 因此我在同一家公司续签了三年 它造成的问题是 现在当我签署我的软件时 新证书在
  • 将任务放入序列容器后无法连接到数据库

    我有一个工作完美的包 直到我决定将它的一些任务放入序列容器中 更多关于我为什么要这样做的信息 在我的情况下如何进行 SSIS 交易 现在 我不断收到错误 Execute SQL Task Error Failed to acquire co
  • 处理每个数组条目的替换,无需 Eval

    例如 我有一个任意字符串数组a 1st 2nd string 3rd nstring n 例如 我想将这些字符串传递给将其参数解释为文件的命令paste 对于固定数量的变量 我们可以使用过程替换 paste lt printf s var1
  • GCP Secret Manager:Spring Boot 应用程序中未解析环境变量和密钥

    下列的本指南 and 这段代码示例 我的里面有这个application deploy yaml spring following cloud gcp project id PROJECT ID Set during build proce
  • 按天分组并仍然显示没有行的日子?

    我有一个日志表 其中包含一个名为 logTime 的日期字段 我需要显示日期范围内的行数以及每天的记录数 问题是我仍然想展示那些日子没有记录 是否可以仅使用 SQL 来完成此操作 Example SELECT logTime COUNT F
  • 如何处理glBufferData期间的GL_OUT_OF_MEMORY错误?

    OpenGL 参考文献提到了GL OUT OF MEMORY error 记录此错误后 除了错误标志的状态外 GL 的状态未定义 功能glBufferData如果无法消化给定的数据 可能会生成此错误 但另一方面 API 似乎没有提供任何方法