0

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

奇怪的是,泄漏持续了一两分钟,然后就停止了(非常一致)。使用任务管理器,泄漏停止时显示 11,012K。

附加说明:我没有使用 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();
        }
    }
}
4

1 回答 1

0

也许你错误地使用了 Push/Pop 对,比要求的多推了一个时间。但最终这会导致缓冲区溢出..

检查您的 Push/Pop 对并确保它们确实是一对。泄漏也可能在周围的代码中。

编辑: OpenGL 接收指令,但它们不会立即执行。OpenGL 有自己的计划。如果你glDeleteTextures不能保证纹理将被删除,直到glFinish/glFlush命令(甚至之后?)。Draw也许OpenGL保留在内存中的代码中还积累了其他东西。当与 glPush/glPop 对共同加入时,它会产生所描述的效果。

于 2011-12-02T08:50:27.870 回答