【问题标题】:OpenGL with GLUT-- malloc errorsOpenGL 与 GLUT——malloc 错误
【发布时间】:2011-07-30 16:33:56
【问题描述】:

我想从 OpenGL 中渲染的 GLUT 窗口中截取图像。在显示回调的一侧,我插入了以下代码:

display() {
        drawTriangle(); //Renders the image
        if(shouldDisplay) {
            shouldDisplay=0;
            bytes = width*height*3; //Color space is RGB
            buffer = (GLubyte *)malloc(bytes); //buffer is global var for now
                glFinish();
            glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);

        }
        glutSwapBuffers();
    }

此代码运行后,malloc 开始失败。它因 ENOMEM 失败,错误 12。我对操作系统或 GLUT 了解不足,无法理解为什么会发生这种情况。我只是想在一台 3 GB 的机器上分配 17K。我正在使用 Windows XP 和 Visual Studio C++ 2010 Express。感谢您提供任何帮助或建议。

【问题讨论】:

  • 宽、高、字节的类型分别是什么,代码运行了多少次,你是不是在某处释放内存?
  • 好一个.. 看不到 free() :)

标签: image opengl malloc cimg


【解决方案1】:

该代码最后错过了free(buffer),因此每次重绘都会消耗越来越多的内存,直到进程耗尽内存和/或地址空间(后者仅在 32 位系统上,因为 64 位在合理的时间内分配少量地址空间几乎不会耗尽)。

【讨论】:

  • 我在与朋友的调试会话中发现了丢失的空闲缓冲区。这导致了我描述的问题。感谢您查看它,我很抱歉发布了这样一个愚蠢的错误。
【解决方案2】:

在调用 glReadPixels 之前尝试glPixelStorei(GL_PACK_ALIGNMENT, 1);

【讨论】:

    【解决方案3】:

    让我重新表述一下这个半吊子的答案。我认为堆正在被丢弃,可能是 missing free() 和连续分配可能是 glReadPixels 覆盖了您的目标缓冲区。

    大多数帧缓冲区至少是 32 位/双字对齐的,这表明,正如这里的评论所说,w*h*4 字节可能只是因为它与内部表示匹配而工作。

    将对齐设置为 1 个字节(就像另一个答案所说)对我来说也很好。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多