LINUX.ORG.RU

Использование памяти OpenGL


0

2

Сегодня, случайно глянув на изменения в показаниях Conky во время работы наколенной программы с OpenGL, работающей с несложными сценами, я заметил, что съедается много ОЗУ. При этом количество потребленной памяти резко уменьшается при открытии вкладки с текстом и, соответственно, увеличивается при возвращении на вкладку с портом OpenGL. Я сразу бросился на поиски утечек памяти в коде и в процессе проб и тестов я обнаружил, что использование памяти резко увеличивается, если включить режим GL_POLYGON_OFFSET_FILL (я его использую для корректного изображения линий сетки). Также я заметил, что использование памяти скачет в процессе зуммирования сцены.

Вопрос в том, сталкивался ли кто с подобным? Вполне может быть, что проблема видео драйвера (на борту встроенная ati x1250 со свободным драйвером) и тема больше соответствует разделу Linux-hardware.

Скрин с GL_POLYGON_OFFSET_FILL

Скрин без GL_POLYGON_OFFSET_FILL

P.S. Этот же код скомпилированный стабильно потребляет несколько десятков мегабайт ОЗУ под оффтопиком не зависимо от режима отрисовки многоугольников и манипуляций с изображением.

★★★

Говорите, свободный драйвер? Может там ещё не реализованы некоторые функции OpenGL аппаратно, и потому считаются программно с помощью Mesa, и вы как раз нашли одну из таких функций?

anonymous
()
Ответ на: комментарий от madcore

>GL_POLYGON_OFFSET_FILL? Сомневаюсь.

Сам в этом сильно сомневаюсь, т.к. потребление памяти при тесте на основе glut, рисующим многоугольники в режиме GL_POLYGON_OFFSET_FILL вполне адекватно. Забыл написать в теме, что для создания порта OpenGL используется наследник QGLWidget (Qt), который размещается как элемент формы. Попробую искать в направлении связи Qt с OpenGL.

Genuine ★★★
() автор топика
Ответ на: комментарий от Genuine

Т.е., выделить самодостаточный кусок кода, воспроизводящий проблему никак? Тогда ответ где-то во всем коде :)
Да и как-будто недостпны средства отладки.

Попробую искать в направлении связи Qt с OpenGL.


Возможно, банально забыл корректно обработать какие-то события.

madcore ★★★★★
()
Ответ на: комментарий от madcore

Вот альтернативный простой пример кода (найденный где-то в сети), в котором нет особой работы с памятью. Я в него добавил режим GL_POLYGON_OFFSET_FILL для изображения ребер куба и поместил прорисовку изображения в цикл (для приближения теста к боевым условиям).

Прошу протестировать при возможности.

На моей машине при работе этого теста (ссылка на проект Qt-Creator) съедается ~ 600Mb ОЗУ.

void GLWidget::paintGL()
{
    //draw scene here

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslated(0.0, 0.0, -1.0);

    glRotatef( rotX, 1, 0, 0 );
    glRotatef( rotY, 0, 1, 0 );
    glRotatef( rotZ, 0, 0, 1 );

    static const int coords[6][4][3] = {
        { { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } },
        { { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } },
        { { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } },
        { { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } },
        { { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } },
        { { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } }
    };
    for (int j = 0; j < 100; j++)
    {
        glEnable(GL_POLYGON_OFFSET_FILL);
        glPolygonOffset(1.0, 1.0);
        for (int i = 0; i < 6; ++i) {
            glColor3ub( i*20+col, 100+i*10+col, i*42+col );
            glBegin(GL_QUADS);
            for (int j = 0; j < 4; ++j) {
                glVertex3d(0.2 * coords[i][j][0], 0.2 * coords[i][j][1], 0.2 * coords[i][j][2]);
            }
            glEnd();
        }
        glDisable(GL_POLYGON_OFFSET_FILL);
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        for (int i = 0; i < 6; ++i) {
            glColor3ub( 0, 0, 0 );
            glBegin(GL_QUADS);
            for (int j = 0; j < 4; ++j) {
                glVertex3d(0.2 * coords[i][j][0], 0.2 * coords[i][j][1], 0.2 * coords[i][j][2]);
            }
            glEnd();
        }
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }
    if(col > 200) col = 0;
    col++;

    rotX += 1.1;
    rotY += 1.4;
    rotZ += 1.6;

}
[[/code]]
Genuine ★★★
() автор топика
Ответ на: комментарий от Novell-ch

>а с LIBGL_ALWAYS_SOFTWARE=1 как себя ведет озу?

Использование ОЗУ при этом вполне адекватно задаче!

Правильно я понимаю, что при этом программ работает программное OpenGL (без аппаратного ускорения).

Genuine ★★★
() автор топика
Ответ на: комментарий от Genuine

да софтварное, в общем подтверждаю, только что пролверил у себя на x1100, ядро и меса из гита пару недельной давности, на галлиумном драйвере тормозит и жрет озу, на классичесом все пучком.
на hd6770 все отлично, так что это проблема или только r300g или только карт без tnl в коим относится x1250 и моя х1100

Novell-ch ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.