Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 使用glClearColor或glPushMatrix/glPopMatrix对时OpenGL内存泄漏?_Memory_Opengl_Memory Leaks_Glew - Fatal编程技术网

Memory 使用glClearColor或glPushMatrix/glPopMatrix对时OpenGL内存泄漏?

Memory 使用glClearColor或glPushMatrix/glPopMatrix对时OpenGL内存泄漏?,memory,opengl,memory-leaks,glew,Memory,Opengl,Memory Leaks,Glew,我开始为一个独立的项目创建一个小游戏引擎。在编写引擎的图形部分时,我注意到当我停止使用glClearColor和glPushMatrix/glPopMatrix对时,内存泄漏会消失。 根据我的研究,这似乎是一个常见的现象,但我还没有找到一个答案,为什么会发生这种情况 奇怪的是,泄漏持续了一两分钟,然后持续停止。 使用任务管理器,泄漏停止时显示11012K 附加说明:我没有使用GLUT,但我使用GLEW_1.7来映射vbo 你知道这是什么原因吗? 是不是因为OpenGL在引擎盖下做了一些奇怪的事情

我开始为一个独立的项目创建一个小游戏引擎。在编写引擎的图形部分时,我注意到当我停止使用glClearColor和glPushMatrix/glPopMatrix对时,内存泄漏会消失。 根据我的研究,这似乎是一个常见的现象,但我还没有找到一个答案,为什么会发生这种情况

奇怪的是,泄漏持续了一两分钟,然后持续停止。 使用任务管理器,泄漏停止时显示11012K

附加说明:我没有使用GLUT,但我使用GLEW_1.7来映射vbo

你知道这是什么原因吗? 是不是因为OpenGL在引擎盖下做了一些奇怪的事情,所以它不是一个问题

这是我唯一称之为glClearColor、glPushMatrix和glPopMatrix的地方

void GraphicsDevice::updateCameraAndClear(IWindow* window)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(32, window->getAspectRatio(), 0.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(100.0f / 255, 149.0f / 255, 237.0f / 255, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_CULL_FACE); // Enable Culling
    glCullFace(GL_BACK);
    glEnable(GL_NORMALIZE);
    glEnable(GL_POLYGON_SMOOTH);
}

void Engine::draw(void)
{
    GraphicsDevice::Instance()->updateCameraAndClear(_window);
    if ( !_states.empty() )
    {
        for(std::vector<IState*>::iterator i = _states.begin(); i != _states.end(); i++)
        {
            glPushMatrix();
            (*i)->draw(this);
            glPopMatrix();
        }
    }
}

可能您错误地使用了Push/Pop对,比要求的时间多推一次。但最终会导致缓冲区溢出

检查您的推送/弹出对,确保它们确实是对。泄漏也可能发生在周围的代码中


编辑:OpenGL接收指令,但不会立即执行。OpenGL有自己的计划。如果使用glDeleteTextures,则不能保证在glFinish/glFlush命令之前或之后删除纹理?。也许OpenGL在内存中保存的绘图代码中还积累了一些其他内容。当与glPush/glPop对共同连接时,会产生所述效果。

如何检测内存泄漏?您在TaskManager中看到的数字是一个工作集大小,我相信,对于单个进程来说,它永远不会减小。顺便说一句,glPushMatrix/glPopMatrix函数已经有相当一段时间被弃用了。我正在使用windows任务管理器查看程序使用了多少。我不知道这些已经被弃用了,但我仍然需要使用它们,因为我只使用OpenGL 1.4-2.0。虽然我使用的硬件支持4.2,但我希望游戏能够在较旧的机器上使用。如果它真的是一个每秒调用几十次的函数的漏洞,任务管理器中的数量将不断增长。glFrustum不是gluPerspective本身的一部分吗?您尝试过在不同的供应商卡上运行此功能吗?这可能是驱动程序的问题。我已经仔细检查过了,我只调用了一对,像这样,void引擎::drawvoid{GraphicsDevice::Instance->updateCameraAndClear\u窗口;if!\u states.empty{forstd::vector::iterator I=\u states.begin;I!=\u states.end;I++{glPushMatrix;*I->drawthis;glPopMatrix;}}可能您错误地使用了Push/Pop对,比要求的时间多推一次。但最终会导致缓冲区溢出-OpenGL将报告堆栈溢出,并显示一条专用错误消息GL_stack_overflow,0x0503。如果这不是glGetError返回的结果,那么就不是发生了什么。堆栈的深度通常不小于32,因此这种情况很快就会发生。我只是检查了一下,确保每帧都打印glGetError,并且每次都返回GLU NOU ERROR。既然您已经接受了我的答案,请让所有人知道错误到底在哪里。这可以帮助其他有类似问题的人。