Подтвердить что ты не робот

TextureView против GLSurfaceView или Как использовать GLSurfaceView с EGL14

Я смущаюсь с EGL.

Мой GLSurfaceView создает EGLContext. Теперь я создаю общий контекст. Теперь мне нужно использовать EGLExtension.

Метод, который мне нужно использовать, называется ( >= API18):

EGLExt.eglPresentationTimeANDROID(android.opengl.EGLDisplay display, android.opengl.EGLSurface surface, long time);

Проблема заключается в том, что GLSurfaceView создает только javax.microedition.khronos.egl.EGLContext s.

Что говорит мне, НЕ использовать GLSurfaceView. Поэтому я попробовал TextureView, который немного похож, с той разницей, что вам приходится обрабатывать свой собственный материал EGL. Что хорошо для этой цели.

Но: TextureView медленнее, по крайней мере, он выглядел так, поэтому я записал некоторые диаграммы с помощью метода Profiler:

Здесь TextureView с собственной обработкой EGL: enter image description here Нить сверху - это часы, которые пробуждают поток в середине, который отображается на TextureView. После этого будет вызван главный поток, для перерисовки TextureView.

... и здесь GLSurfaceView с собственной обработкой EGL На этот раз часы находятся посередине, он вызывает поток сверху, чтобы отобразить мое изображение в фреймбуфере, которое я передаю непосредственно в SurfaceView (RENDERMODE_WHEN_DIRTY) и вызываю requestRender, чтобы запросить визуализацию. enter image description here

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

В обоих примерах у меня не было ничего другого на экране, и они отображали точно такие же Meshes с тем же шейдером.

На мой вопрос: Есть ли способ использовать GLSurfaceView с контекстами EGL14?

Я сделал что-то не так?

4b9b3361

Ответ 1

Что вы, вероятно, захотите сделать, это использовать простой SurfaceView.

Здесь короткая версия:

  • SurfaceView имеет две части, Surface и немного поддельных вещей в View. Surface передается непосредственно на поверхностный композитор (SurfaceFlinger), поэтому, когда вы нарисуете его с помощью OpenGL, относительно немного накладных расходов. Это делает его быстрым, но также делает его не совсем правильным с иерархией View, потому что Surface находится на одном уровне, а пользовательский интерфейс на основе представления находится на другом уровне.
  • TextureView также имеет две части, но часть, которую вы рисуете на жизнях за кулисами (там, где входит SurfaceTexture). Когда рамка будет закончена, материал, который вы нарисовали, близок к слою "Вид". Графический процессор может сделать это быстро, но "некоторая работа" всегда медленнее, чем "нет работы".
  • GLSurfaceView - это SurfaceView с классом-оболочкой, который выполняет всю настройку EGL и обмен сообщениями между потоками.

Изменить: длинная версия доступна здесь.

Если вы можете самостоятельно выполнить настройку GL/EGL и управление потоками - что, если вы сейчас работаете в TextureView, вы можете это сделать, то вам, вероятно, следует использовать простой SurfaceView.

Сказав все это, вы можете сделать свой исходный код с помощью GLSurfaceView. Я ожидаю, что вы хотите вызвать eglPresentationTimeANDROID() в контексте EGL, который делится с GLSurfaceView, а не изнутри GLSurfaceView, поэтому не имеет значения, что GLSurfaceView использует EGL10 внутренне. Для совместного использования контекста используется контекстная клиентская версия (например, GLES2 и GLES3), а не версия интерфейса EGL, используемая для настройки контекста.

Вы можете увидеть примеры всего этого, работающего в Grafika. В частности:

  • "Показывать + камеру захвата" использует GLSurfaceView, камеру и видеокодер. Обратите внимание, что контекст EGL является общим. Пример свернутый и несколько болезненный, главным образом потому, что он намеренно пытается использовать GLSurfaceView и общий контекст EGL. ( Обновить: обратите внимание на эту проблему относительно условий гонки с общими контекстами.)
  • "Воспроизвести видео (TextureView)" и "Basic GL в TextureView" показать TextureView в действии.
  • "Запись приложения GL с FBO" использует обычный SurfaceView.

Ответ 2

Благодаря fadden! Он работал, как ожидалось.

Для всех, кто думает о том, чтобы делать что-то подобное:

У него есть преимущества и недостатки с помощью SurfaceView (GL) для рендеринга изображений на нем.

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

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

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

Надеюсь, что смогу помочь некоторым из вас!