Какой вид лучше всего подходит для предварительного просмотра камеры Android?

Как мы знаем, мы можем выбрать TextureView, SurfaceView и GLSurfaceView для предварительного просмотра камеры Android.

Какой из них лучше всего подходит для предварительного просмотра камеры? Я сосредоточен на производительности камеры.


person Jerikc XIONG    schedule 11.06.2015    source источник


Ответы (2)


С точки зрения производительности SurfaceView является победителем.

В SurfaceView кадры поступают с камеры и пересылаются в компоновщик системной графики (SurfaceFlinger) без копирования. В большинстве случаев любое масштабирование будет выполняться процессором дисплея, а не графическим процессором, а это означает, что вместо однократного сканирования пикселей для масштабирования и повторного сканирования, они сканируются только один раз.

GLSurfaceView — это SurfaceView с некоторыми классами-оболочками, которые обрабатывают настройку EGL и управление потоками. Вы не можете использовать OpenGL ES на Surface, который получает кадры с камеры, поэтому вы выполняете дополнительную работу без какой-либо пользы. (Накладные расходы связаны с незначительной разовой настройкой, а не на каждый кадр, поэтому вы, скорее всего, не сможете измерить разницу.)

TextureView получает кадры в SurfaceTexture как «внешнюю» текстуру OpenGL ES, а затем использует GLES для их визуализации на поверхности пользовательского интерфейса приложения. Масштабирование и рендеринг выполняются графическим процессором, а затем результат передается в SurfaceFlinger. Это самый медленный вариант, но и самый гибкий из представлений.

Если вы хотите узнать больше о том, как работает система, см. документ Android Graphics Architecture< /а>.

person fadden    schedule 11.06.2015
comment
Это так ясно. Спасибо. Кстати, а если мне нужно использовать кадр камеры для кодирования для прямой трансляции? - person Jerikc XIONG; 12.06.2015
comment
Спасибо за вашу большую помощь. А как насчет API 18/API 21? - person Jerikc XIONG; 12.06.2015
comment
До API 18 вы не можете перемещать данные через поверхности, что означает перемещение их через программные буферы (намного медленнее). Будет ли это жизнеспособным, зависит от ваших потребностей (разрешение, частота кадров и т. д.). - person fadden; 12.06.2015
comment
Ты такой клевый. Вы написали Grafika и управляете bigflake.com. Отличная работа! У вас есть сайт-блог? Я хочу следовать за тобой. - person Jerikc XIONG; 14.06.2015
comment
Не могли бы вы предоставить свой идентификатор facebook/google plus/twitter или адрес электронной почты? Спасибо. - person Jerikc XIONG; 24.06.2015

" SurfaceView создает новое окно в оконной системе Android. Его преимущество в том, что если SurfaceView обновится, будет обновлено только это окно. Если вы дополнительно обновите элементы пользовательского интерфейса (которые находятся в другом окне оконной системы), то оба обновления операции блокируют себя (особенно когда отрисовка пользовательского интерфейса поддерживается аппаратно), потому что opengl не может правильно обрабатывать многопоточную отрисовку.

В таком случае может быть лучше использовать TextureView, потому что это не другое окно Android Windowsystem. поэтому, если вы обновите свой вид, все элементы пользовательского интерфейса также будут обновлены. (Наверное) все в одном потоке.

Надеюсь, я смог помочь некоторым из вас! Источник: stackoverflow.com

GLSurfaceView — это SurfaceView с классом-оболочкой, который выполняет всю настройку EGL и обмен сообщениями между потоками за вас.

Это полностью зависит от вас, что вы используете. У них есть свои плюсы и минусы друг перед другом :)

person Ritvik Vyas    schedule 11.06.2015