【问题标题】:OpenGL "out of memory" on glReadPixels()glReadPixels() 上的 OpenGL“内存不足”
【发布时间】:2010-03-14 16:00:40
【问题描述】:

在内存不足的情况下,我在 glReadPixels() 上遇到了来自 OpenGL 的“内存不足”错误。我正在为具有针对这种情况的强大堆机制的程序编写插件,但我不知道是否可以或如何使 OpenGL 将其用于应用程序内存管理。通过这个[尽管过时的]线程在 Mac OS [不是 X] 下的类似问题上引起了我的注意,这个想法甚至可能引起我的注意:http://lists.apple.com/archives/Mac-opengl/2001/Sep/msg00042.html

我使用的是 Windows XP,并且已经在多张 NVidia 卡上看到过它。我也对我可能能够传达给用户的任何解决方法感兴趣(线程提到“增加虚拟内存”)。

谢谢,肖恩

【问题讨论】:

    标签: windows opengl device-driver


    【解决方案1】:

    我很确定 glReadPixels 不会引发内存不足错误(实际上 glReadPixels 本身不会分配内存)。

    该错误可能是由分配缓冲区对象或纹理的其他例程引发的。一旦检测到内存不足错误,您应该释放所有非强制缓冲区对象(纹理、纹理 mipmap、很少使用的缓冲区对象),以便分配一个新的缓冲区对象来保存 glReadPixels 返回的数据。

    【讨论】:

    • 你完全正确!我的代码中有一个错误导致错误代码落入 glReadPixels() 上的错误检查。感谢您在这个问题上让我摆脱了我的心理牢笼..
    • 你怎么能“确定” glReadPixels 不会分配任何东西?它完全依赖于实现。
    • @Bahbar:GL_OUT_OF_MEMORY 并不意味着 malloc 失败了!它与图形内存有关,每个OpenGL调用都很好地定义了每个可以返回的错误代码!我“非常”肯定,因为我不能说特定的 OpenGL 实现符合规范;但如果是,glReadPixels 不能返回 GL_OUT_OF_MEMORY。
    • 嗯?该规范对此主题有这样的说法:“如果内存因执行命令的副作用而耗尽,则可能会生成错误 OUT_OF_MEMORY”。故意很模糊。然而,我完全期待如果 malloc 在 GL 实现中失败并且正确实现,它返回 GL_OUT_OF_MEMORY。它还能做什么?
    • 所有 GL 入口点可以返回 GL_OUT_OF_MEMORY。这在“GL 错误”2.5 部分中进行了描述。
    【解决方案2】:

    没有更多细节,很难说。最终,OpenGL 将在需要分配时与本机操作系统对话。因此,如果不出意外,您始终可以为您的进程替换(或挂钩)默认 CRT/堆分配器,并让它从插件主机中“更强大”的堆管理器中获取块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多