Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


TextureView vs GLSurfaceView o Cómo utilizar GLSurfaceView con EGL14

Me estoy confundiendo con EGL.

My GLSurfaceView crea un EGLContext. Ahora creo un contexto compartido. Ahora necesito usar un EGLExtension.

El método que tengo que usar se llama (> = API18):

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

El problema es que GLSurfaceView sólo crea javax.microedition.khronos.egl.EGLContext s.

Lo que me dice, NO usar GLSurfaceView. Así que probé TextureView, que es ligeramente similar, con la diferencia de que tienes que manejar tu propio material EGL. Lo cual es bueno para ese propósito.

Pero: El TextureView es más lento, al menos se veía así, por lo que grabó algunos diagramas con el Profiler de métodos:

Aquí el TextureView con su propio manejo EGL: Introduzca aquí la descripción de la imagen El hilo en la parte superior es un reloj que despierta el hilo en el centro, que se transforma en el TextureView. El hilo principal se llamará después de eso, para volver a dibujar el TextureView.

… y aquí el GLSurfaceView con su propio EGL Handling El reloj está en el medio esta vez, llama a Thread en la parte superior para hacer mi imagen en un framebuffer, que doy directamente en el SurfaceView (RENDERMODE_WHEN_DIRTY) y requestRender de llamada a Solicitar la vista para hacer. Introduzca aquí la descripción de la imagen

Como se puede ver con un breve vistazo ya que con el GLSurfaceView que parece más limpio que con el TextureView.

En ambos Ejemplos no he tenido nada más en la pantalla y ellos hicieron exactamente las mismas mallas con el mismo sombreador.

A mi pregunta: ¿Hay una manera de utilizar GLSurfaceView con EGL14 Contexts?

¿Hice algo mal?

  • ¿Cómo determino la orientación predeterminada de los marcos de previsualización de la cámara?
  • Android SurfaceTexture.detachFromGLContext Error durante detachFromGLContext
  • La visualización de la vista previa de la cámara de vidrio es ilegible
  • Android TextureView / Dibujo / Rendimiento de la pintura
  • Realice un ajuste de vídeo en un TextureView (Partes de él están fuera (no visibles)) con MediaPlayer
  • Los métodos SurfaceTexture no siempre se utilizan en Android 7.0
  • Escena de OpenGL con fondo transparente + widgets nativos por debajo y por encima
  • ¿Qué puedo hacer cuando el BufferQueue ha sido abandonado?
  • 2 Solutions collect form web for “TextureView vs GLSurfaceView o Cómo utilizar GLSurfaceView con EGL14”

    Lo que probablemente querrá hacer es utilizar un SurfaceView simple.

    Aquí está la versión corta:

    • SurfaceView tiene dos partes, la Surface y un poco de material falso en la View . La Surface se pasa directamente al compositor de superficie (SurfaceFlinger), por lo que cuando se dibuja en él con OpenGL hay relativamente poca sobrecarga. Esto hace que sea rápido, pero también hace que no juegue muy bien con la jerarquía Ver, porque la Surface está en una capa y la interfaz basada en vista está en una capa diferente.
    • TextureView también tiene dos partes, pero la parte que dibuja en vive detrás de las escenas (que es donde entra en SurfaceTexture ). Cuando el marco está completo, las cosas que dibujó se blitted en la capa de vista. La GPU puede hacer esto rápidamente, pero "algunos trabajos" son siempre más lentos que "sin trabajo".
    • GLSurfaceView es un SurfaceView con una clase de contenedor que realiza toda la configuración de EGL y los mensajes de interconexión para usted.

    Editar: la versión larga está disponible aquí .

    Si usted puede hacer la configuración de GL / EGL y la gestión de hilos usted mismo – que, si usted ahora está funcionando en un TextureView, usted puede claramente – entonces usted debe utilizar probablemente un SurfaceView llano.

    Habiendo dicho todo eso, debería ser posible hacer que su código original funcione con GLSurfaceView . Espero que quieras llamar eglPresentationTimeANDROID() en el contexto EGL que se comparte con GLSurfaceView , no desde GLSurfaceView sí mismo, por lo que no importa que GLSurfaceView está usando EGL10 internamente. Lo que importa para compartir el contexto es la versión del cliente de contexto (por ejemplo, GLES2 vs. GLES3), no la versión de la interfaz EGL utilizada para configurar el contexto.

    Puedes ver ejemplos de todo esto trabajando en Grafika . En particular:

    • "Show + capture camera" utiliza un GLSurfaceView , la cámara y el codificador de vídeo. Tenga en cuenta que el contexto EGL es compartido. El ejemplo es complicado y algo doloroso, sobre todo porque está tratando deliberadamente de usar GLSurfaceView y un contexto compartido de EGL. ( Actualización : tenga en cuenta este problema sobre las condiciones de carrera con contextos compartidos.)
    • "Reproducir vídeo (TextureView)" y "GL básico en TextureView" muestran TextureView en acción.
    • "Grabar aplicación GL con FBO" utiliza un SurfaceView simple.

    Gracias a fadden! Funcionó como se esperaba.

    A todos los que piensan en hacer algo similar:

    Tiene ventajas y desventajas usando el (GL) SurfaceView para renderizar imágenes en él.

    Mis testresults en el post anterior no tienen nada más en la pantalla que la imagen renderizada en sí. Si tiene otros elementos de interfaz de usuario en la pantalla, especialmente si se actualizan con frecuencia, debería reconsiderar mi elección de preferir el (GL) SurfaceView.

    SurfaceView crea una nueva ventana en el sistema Windows Android. Su ventaja es que si el SurfaceView se actualiza, sólo se actualizará esta ventana. Si además actualizas los Elementos de UI (que están en otra ventana del sistema Windows), ambas operaciones de actualización bloquean themselfes (especialmente cuando el dibujo de ui es hardwaresupported) porque opengl no puede manejar correctamente el dibujo de hilos múltiples.

    Para tal caso podría ser mejor usar el TextureView, porque no es otra ventana del sistema Windows Android. Así que si actualiza su vista, todos los elementos de la interfaz de usuario también se actualizan. (Probablemente) todo en un hilo.

    Espero poder ayudar a algunos de ustedes!

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.