Intereting Posts
OnBackStackChanged () вызывается дважды, когда новый фрагмент добавляется в backstack Различия между различными типами bool? Установочный сервер Android Market пуст для установки с рынка. Это ошибка или нормальное поведение? Библиотека GCM для Android SDK Требовать проект Gradle из другого каталога Запуск тестов автоматизации пользовательского интерфейса с помощью градиента без удаления Автоматически регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks? Android Studio ConstraintLayout с ScrollView Appcelerator vs Android SDK Приложение загружается с белым экраном в течение 3 секунд, прежде чем показывать правильный пользовательский интерфейс – используя фрагменты (без веб-просмотра) Невозможно использовать Fragment.setRetainInstance () в качестве замены для Activity.onRetainNonConfigurationInstance () Android: метод onChange () для наблюдателя контента вызывается несколько раз Конфигурация Google Play Services v23 Proguard Переход общего элемента с помощью операции «Диалог» Ошибка genymotion openGL

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: Введите описание изображения здесь Поток сверху – это часы, которые пробуждают поток в середине, который отображается на TextureView. После этого будет вызван основной поток для перерисовки TextureView.

… и здесь GLSurfaceView со своей обработкой EGL. Часы в середине на этот раз, он вызывает Thread сверху, чтобы сделать мое изображение в фреймбуфере, который я передаю непосредственно в SurfaceView (RENDERMODE_WHEN_DIRTY) и вызывает запросRender, чтобы Запросить визуализацию. Введите описание изображения здесь

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

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

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

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

Solutions Collecting From Web of "TextureView против GLSurfaceView или Как использовать GLSurfaceView с EGL14"

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

Вот короткая версия:

  • SurfaceView имеет две части: Surface и немного поддельных вещей в View . Surface передается непосредственно на поверхностный композитор (SurfaceFlinger), поэтому, когда вы рисуете на нем с помощью OpenGL, относительно немного накладных расходов. Это делает его быстрым, но также делает его не совсем правильным с иерархией View, потому что Surface находится на одном уровне, а интерфейс на основе View находится на другом уровне.
  • 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 .

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

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

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

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

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

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

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