2014-12-09 4 views
2

Я пытаюсь использовать применять эффекты в реальном времени для предварительного просмотра камеры и показать в нескольких представлениях, как я могу это сделать?
(так же, как camera2) (snapshot)Комбинация SurfaceView или TextureView

Я знаю 2 подхода, чтобы показать эффекты в реальном времени на предпросмотр камеры, если не ScrollView вовлеченного на левой стороне.

  • Использование GLSurfaceView и setRenderer. Привяжите SurfaceTexture как внешнюю текстуру GLES и используйте GLSL (OpenGL Shading Language) для применения эффектов.
  • Использование TextureView. Это сложнее, потому что нужно настроить EGLContext/EGLSurface и управлять потоками.

Однако, я не знаю, как сделать ScrollView с элементами эффекта в реальном времени наложением композиции GLES.

  1. Должен ли я выбрать GLSurfaceView (для исполнения) или TextureView (для flexble) осуществлять Scrollview? Какой из них является лучшим решением и почему?
  2. Можно ли разделить один контекст/поверхность EGL между несколькими видами? Если да, то какие-либо фрагменты кода для ссылки?

После прибегая к помощи и читать хороший Graphics architecture статьи и Grafika проект, я до сих пор понятия не имею ...
Может быть, я пропустил что-то важное, дозировать кто-то момент меня? Заранее спасибо.

ответ

6

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

Если вы хотите, чтобы он выглядел хорошо при прокрутке, вам, вероятно, понадобится TextureView.

Возможно, чтобы несколько контекстов EGL обменивались данными, и можно использовать один контекст EGL для отображения более чем одной поверхности. Grafika имеет примеры обоих («show + capture camera» использует GLSurfaceView и общий контекст EGL, «непрерывный захват» использует SurfaceView и один контекст EGL, причем оба действия отображают поверхность на экране и поверхность вне экрана).

Все аппаратно-ускоренные представления выполняют свое собственное управление контекстом EGL, и нет никаких оснований вмешиваться в это, если вы выполняете рендеринг на SurfaceView или TextureView.

Если вы планируете нарисовать несколько версий предварительного просмотра в реальном времени в реальном времени, вы получите максимальную производительность, отдав их всех в одиночной сцене. Рендеринг нескольких объектов TextureView будет менее эффективным. В зависимости от ваших вариантов пользовательского интерфейса это может означать обработку чертежа элемента и прокрутку себя, а не передачу его в ListView. (По крайней мере, вы хотите убедиться, что вы живете, обновляя миниатюры, которые на самом деле находятся на экране.)

+0

Итак, если я уже использовал GlSurfaceView в спину, лучше выбрать TextureView сверху того, что?** Создайте второй контекст EGL для поверхности TextureView и поделитесь состоянием с контекстом GLSurfaceView? ** Затем вместо нескольких TextureViews просто выведите несколько квадов с GLES на один TextureView внутри ScrollView? ** Пожалуйста, исправьте меня, если я ошибаюсь , благодаря. – Justin

+0

Еще одна мысль. Для лучшей производительности и большего контроля над процессом рендеринга можно ли использовать 2 SurfaceViews для этого? (Затем я могу использовать один контекст EGL для рендеринга 2 поверхности, как «show + capture camera»). – Justin

+1

Если вы хотите использовать GLSurfaceView, а не обычный SurfaceView, вы застряли в состоянии совместного использования контекста EGL. Если вы используете обычный SurfaceView для обратной стороны, вы можете использовать один контекст EGL. TextureView + ScrollView кажется разумным, хотя я сам не пробовал. Использование двух SurfaceViews возможно, если вы установили Z-порядок в положение один напротив другого, но вы можете получить удар производительности, если количество поверхностей, скомпонованных SurfaceFlinger, превышает число наложенных плоскостей. (См. «Многоповерхностная» активность Grafika.) – fadden

Смежные вопросы