OpenGL: проблемы с производительностью рендеринга программного обеспечения Mesa3D Offscreen

Я использую Yocto как встроенную систему с OpenGL 2.1, GLEW 2.0.0 и Mesa 17.0.2. Я делаю программный рендеринг с экрана на монитор через HD/SDI. Проблема, с которой я сталкиваюсь, заключается в том, что моя частота обновления составляет около 1 Гц. На моем компьютере для разработки у меня около 20 кадров в секунду, когда аппаратное ускорение отключено в Debian. Встроенная машина не такая мощная, поэтому я понимаю снижение производительности, но 1 FPS кажется немного низким. Для моей оптимизации я отключил:

glDiasble(GL_LINE_SMOOTH)
glDiasble(GL_POINT_SMOOTH)
glDiasble(GL_SMOOTH)
glDiasble(GL_MULTISAMPLE)
glShadeModel(GL_NONE)

У меня нет отбраковки, потому что я использую только 2D-изображения.

Однако я установил минимальный и магнитный фильтр на GL_NEAREST.

Моя замена буфера и создание контекста выглядит примерно так:

        bool makeContext()
        {
            width = 1280;
            height = 720;

            context = OSMesaCreateContextExt(OSMESA_RGBA, 0, 0, 0, NULL);
            if(!context)
            {
              //...
              return false;
            }
            bufferSize = width * height * 4 * sizeof(GL_UNSIGNED_BYTE);
            frameBuffer = (char*)mallic(bufferSize);
            frameBuffer = (char*)0_buf_baseaddr;
            if(!OSMesaMakeCurrent(context, frameBuffer, GL_UNSIGNED_BYTE, width, height));
            {
               //...
               return false;
            }

            OSMesaPixelStore(OSMESA_Y_UP, 0)
            {
              //...
            }

            return true;
         }

void swapBuffers()
    {
      frameBuffer = (char*) swap_page(); //returns a spot in memory with update
      OSMesaMakeCurrent(context, frameBuffer, GL_UNSIGNED_BYTE, width, height);
    }

Я думал о применении трафарета, но не уверен, что это поможет производительности. Я почти уверен, что проблема связана с интенсивным использованием альфа-каналов с моими изображениями, которые я использую. Несколько движущихся слоев друг за другом для получения желаемых эффектов.

Что-то не так с моим обменом или созданием, что очевидно? Кроме того, основываясь на уже сделанных мною оптимизациях, могу ли я сделать что-нибудь еще, что могло бы помочь?


person Noble    schedule 12.03.2019    source источник
comment
Каковы характеристики вашего встроенного целевого устройства (частота процессора, пропускная способность памяти и т. д.)? Уменьшите размер фреймбуфера до 320x240. 1280 x 720 – это много пикселей для встроенного целевого устройства, не говоря уже о настольном оборудовании. Ваша встроенная цель имеет несколько ядер? Если да, то используете ли вы бэкенд llvmpipe? По умолчанию он многопоточный.   -  person genpfault    schedule 12.03.2019
comment
Проверьте, поддерживает ли ваша Mesa glInvalidateFramebuffer() через ARB_invalidate_subdata, это может быть быстрее, чем прямое glClear()с.   -  person genpfault    schedule 12.03.2019
comment
Отличные вопросы, скорость процессора на данный момент неизвестна, а максимальная память составляет два гигабайта. Что касается уменьшения размера буфера, не изменит ли это расположение моих изображений на экране? Скажем, у меня есть изображение, расположенное на 722, 240 (случайная точка). Будет ли это теперь вырвано из контекста? А так как у меня тест ножницами, вырезать все вместе? Кроме того, я изучу glInvalidateFrameBuffer, как вы упомянули. Это все отличные моменты, большое спасибо.   -  person Noble    schedule 12.03.2019
comment
Четырехъядерный ARM 1,5 ГГц   -  person Noble    schedule 12.03.2019
comment
У вашего ARM есть драйверы GL, верно? Если драйверов нет, Mesa вернется к программному рендерингу. Обратите внимание, что ARM обычно не имеет GL, а большинство драйверов — GLES.   -  person Ross Burton    schedule 27.03.2019
comment
Если вам нужен программный рендеринг, то либо включите llvmpipe, либо, что еще лучше, не используйте GL. Если вы просто смешиваете изображения, используя что-то, что не является программным обеспечением, GL будет намного быстрее.   -  person Ross Burton    schedule 27.03.2019


Ответы (1)


Мне удалось повысить производительность примерно на 10%, удалив и прочесав некоторые образы ресурсов. В основном, делая мой glClear цветом моего самого дальнего изображения (на один ресурс меньше для рисования), а затем перекрывая мои изображения альфа-каналами сверху. Мой графический интерфейс в значительной степени зависит от альфа-каналов, поэтому даже на один вызов отрисовки меньше влияет на программный рендеринг.

person Noble    schedule 27.03.2019
comment
Кроме того, из gitlab.freedesktop.org/mesa/demos/tree/master /src/демо. Похоже, что при использовании интенсивного смешивания ожидается ~ 1 FPS без какой-либо аппаратной поддержки. Поместите это сюда на случай, если кто-то еще столкнется с чем-то подобным. - person Noble; 04.04.2019