eglSwapBuffers очень медленно на Raspberry Pi - PullRequest
0 голосов
/ 26 апреля 2019

В настоящее время я портирую приложение OpenGL (которое рисует только 2D-объекты) на OpenGL ES для правильной работы на Raspberry Pi.

По какой-то причине eglSwapBuffers занимает огромное количество времени. Вот мой тест, который я сделал (и вы можете увидеть, какие функции я использую):

****** BEGIN BENCHMARK RESULTS
GLESSTATS swap_buffers: 519,180 ms
GLESSTATS createShader: 5,508 ms
GLESSTATS createProgram: 3,584 ms
GLESSTATS setViewport: 0,010 ms
GLESSTATS createTexture: 17,087 ms
GLESSTATS bindTexture: 0,008 ms
GLESSTATS updateTexture: 2,192 ms
GLESSTATS drawGradientRect: 0,288 ms
GLESSTATS drawTexturedRect: 0,206 ms
****** END BENCHMARK RESULTS

В настоящее время я пытаюсь создать поверхность RGBA. Вот мои атрибуты для EGL:

EGLint ctx_attrs[] = {
    EGL_RENDERABLE_TYPE, OPEN_GL_ES2_BIT,
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RED_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_BLUE_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_NONE
};

EGLint surf_attrs[] = {
    EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
    EGL_NONE
};

Я что-то здесь не так делаю? Все, что я обнаружил, это то, что несовпадающий формат пикселя между окном и поверхностью может заставить swap_buffers занимать много времени. Я попробовал это с R5G6B5, с R8G8B8 и R8G8B8A8.

1 Ответ

1 голос
/ 29 апреля 2019

Важно помнить, что графический процессор и процессор работают независимо, поэтому вызовы драйвера OpenGL обычно асинхронны. В какой-то момент ЦП должен сидеть сложа руки и ждать завершения этих вызовов OpenGL.

Как Андреас упомянул в комментарии выше, вызов для принудительной синхронизации CPU / GPU - это glFinish (), и так получилось, что eglSwapBuffers фактически вызовет glFinish, прежде чем он начнет менять буферы.

Это означает, что время для eglSwapBuffers, скорее всего, будет включать почти все время, потраченное на обработку updateTexture, drawGradientRect, drawTexturedRect, а также время на замену буферов.

Я также надеюсь, что ваши временные единицы неверны? Полсекунды для рендеринга кадра не звучат для меня замечательно? Ты уверен, что они не нс вместо мс?

Кроме того, я надеюсь, что вы не компилируете новый шейдер и не создаете новую текстуру каждый кадр? (и делают ли они только тогда, когда они действительно меняются?). Если вам нужно для создания новой текстуры в каждом кадре, убедитесь, что вы удаляете текстуру GL после завершения рендеринга, иначе утечка памяти может стать причиной замедления.

...