Буферизация или удержание кадров в OpenGLES

Я пытаюсь буферизовать до 10 кадров в GLES на Android. Входящие кадры поступают с камеры на surfacetexture, и я обрабатываю изображение с помощью OpenGles. Я пытаюсь сделать это, потому что я применяю несколько фильтров gles, вызывающих зависание графического процессора, и поэтому я теряю частоту кадров. (Камера со скоростью 30 кадров в секунду дает 25 кадров). Я думаю, что если я смогу удержать несколько кадров и внедрить циклический буфер, я должен иметь возможность задерживать кадры на фиксированную величину (добавлять задержку), но при этом обеспечивать постоянную частоту кадров (пропускную способность).

Любые идеи о том, как это можно сделать?


person Crearo Rotar    schedule 28.05.2018    source источник
comment
Если ваш шейдер не справляется с поступающими кадрами, буферизация вам не поможет, если только ваши проблемы не вызваны всплеском трафика (т. е. вы обычно быстрее 30 кадров в секунду, но время от времени вы получаете 5 или 6 кадров, которые делаются очень долго). FWIW, одним из способов реализации буферизации будет подача входящего видео в видеокодер, а затем сохранение вывода H.264 в циклическом буфере (а-ля CircularBufferEncoder) с некоторым снижением качества из-за кодирования. Оптимизация ваших шейдеров, скорее всего, даст полезные результаты.   -  person fadden    schedule 19.07.2018


Ответы (1)


Вы, вероятно, не можете - вы не получаете прямого контроля над управлением поверхностью окна в OpenGL ES на Android - вы получите столько буферов в цепочке подкачки, сколько система настроена для предоставления (обычно три).

Маловероятно, что добавление более трех действительно поможет улучшить согласованность частоты кадров, потому что вы все равно привязаны к ограничениям отображения вертикальной синхронизации.

person solidpixel    schedule 28.05.2018