O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

EGLSurfaces e OpenGL ES

O Android usa a API OpenGL ES (GLES) para renderizar gráficos. Para criar contextos GLES e fornecer um sistema de janelas para renderizações GLES, o Android usa a biblioteca EGL . As chamadas GLES renderizam polígonos texturizados, enquanto as chamadas EGL colocam renderizações nas telas.

Antes de desenhar com GLES, você precisa criar um contexto GL. Em EGL, isso significa criar um EGLContext e um EGLSurface. As operações do GLES se aplicam ao contexto atual, que é acessado por meio do armazenamento local do segmento em vez de passado como um argumento. O código de renderização deve ser executado em um thread GLES atual, não no thread de IU.

EGLSurfaces

O EGLSurface pode ser um buffer fora da tela alocado pelo EGL, chamado de pbuffer , ou uma janela alocada pelo sistema operacional. Chamar a função eglCreateWindowSurface() cria superfícies de janela EGL. eglCreateWindowSurface() recebe um objeto de janela como argumento, que no Android é uma superfície. Uma superfície é o lado do produtor de um BufferQueue. Os consumidores , que são SurfaceView, SurfaceTexture, TextureView ou ImageReader, criam superfícies. Quando você chama eglCreateWindowSurface() , o EGL cria um novo objeto EGLSurface e o conecta à interface do produtor do BufferQueue do objeto de janela. Desse ponto em diante, a renderização para aquele EGLSurface resulta em um buffer sendo retirado da fila, renderizado e enfileirado para uso pelo consumidor.

O EGL não fornece chamadas de bloqueio / desbloqueio. Emita comandos de desenho e chame eglSwapBuffers() para enviar o quadro atual. O nome do método vem da troca tradicional de buffers frontais e traseiros, mas a implementação real pode ser diferente.

Apenas um EGLSurface pode ser associado a uma superfície por vez (você pode ter apenas um produtor conectado a um BufferQueue), mas se você destruir o EGLSurface, ele se desconectará do BufferQueue e permitirá que outra coisa se conecte.

Um determinado encadeamento pode alternar entre vários EGLSurfaces, alterando o que é atual . Um EGLSurface deve ser atual em apenas um encadeamento por vez.

EGL não é outro aspecto de uma superfície (como SurfaceHolder). EGLSurface é um conceito relacionado, mas independente. Você pode desenhar em uma EGLSurface que não seja apoiada por uma superfície e pode usar uma superfície sem EGL. O EGLSurface apenas fornece ao GLES um lugar para desenhar.

Consulte o documento de definição de compatibilidade do Android para requisitos de OpenGL ES e EGL.

ANativeWindow

A classe de superfície pública é implementada na linguagem de programação Java. O equivalente em C / C ++ é a classe ANativeWindow, semi-exposta pelo Android NDK . Você pode obter ANativeWindow de uma superfície com a chamada ANativeWindow_fromSurface() . Assim como seu primo da linguagem Java, você pode bloqueá-lo, renderizar em software e desbloquear e postar. O tipo de janela nativa básica é o lado do produtor de um BufferQueue.

Para criar uma superfície de janela EGL a partir do código nativo, passe uma instância de EGLNativeWindowType para eglCreateWindowSurface() . EGLNativeWindowType é um sinônimo para ANativeWindow, portanto, você pode converter um para o outro.