Утечки памяти OpenGL при использовании пары glClearColor или glPushMatrix / glPopMatrix? - PullRequest
0 голосов
/ 02 декабря 2011

Я начал создавать небольшой игровой движок для самостоятельного проекта. При написании графической части движка я заметил утечку памяти, которая исчезает, когда я прекращаю использовать пары 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();
        }
    }
}

1 Ответ

0 голосов
/ 02 декабря 2011

Возможно, вы используете пару Push / Pop неправильно, нажимая на один раз больше, чем требуется. Но в конечном итоге это приведет к переполнению буфера.

Проверьте ваши пары Push / Pop и убедитесь, что это действительно пары. Утечка также может быть в окружающем коде.

РЕДАКТИРОВАТЬ: OpenGL получает инструкции, но они не выполняются немедленно. У OpenGL есть собственный план. Если вы glDeleteTextures, вам не гарантируется, что текстура будет удалена до команды glFinish / glFlush (или даже после?). Возможно, в вашем Draw коде накапливается что-то еще, что OpenGL хранит в памяти. Что дает описанный эффект при совместном соединении с парами glPush / glPop.

...