Cómo llamar a Surfaceflinger entre procesosAndroid SurfaceFlinger 1.SurfaceFlinger es una función que recibe la superficie dibujada por la capa superior, la procesa y la pasa al hardware subyacente para su visualización. Es una función que procesa la superficie dibujada por la capa superior y la pasa al hardware subyacente para su visualización. 2. La siguiente figura detalla la función de SurfaceFlinger. Surface es un concepto e hilo importante en el sistema de gráficos de Android View y sus subclases (como TextView, Button) se dibujan en la superficie. Cada superficie crea un objeto de lienzo (pero las propiedades pueden cambiar en cualquier momento), que se utiliza para administrar las operaciones de dibujo de la vista en la superficie, como dibujar puntos y líneas. Cada objeto de lienzo corresponde a un mapa de bits que almacena el contenido dibujado en la superficie. Cada superficie generalmente tiene dos búfer, un búfer frontal y un búfer posterior. El búfer posterior es el mapa de bits dibujado por el lienzo, por lo que el dibujo siempre se completa en el búfer posterior. Cuando sea necesario actualizar, el búfer posterior se actualizará. con el intercambio de búfer frontal. La ventana está unida a la superficie. La ventana está vinculada a la superficie, ViewRoot le pide a la superficie un lienzo y la vista usa ese lienzo para dibujar. Después de que la vista dibuja datos en el lienzo, ViewRoot llama a Surface.unplease. ViewRoot llamará a Surface.unlockCanvasAndPost(canvas) para programar SurfaceFlinger::composeSurfaces() para que realmente muestre el panel. SurfaceFlinger maneja la transferencia de datos de dibujo desde el lienzo al búfer frontal o posterior de la superficie, excepto SurfaceViews, donde diferentes vistas en el mismo ViewRoot comparten la misma vista. SurfaceFlinger se utiliza para transferir datos de dibujo desde el lienzo al búfer frontal o posterior de la superficie, excepto para SurfaceViews, donde diferentes vistas en el mismo ViewRoot comparten la misma superficie. Las capas son cosas que SurfaceFlinger puede componer (que debería llamarse LayerFlinger). Si miras el código, verás que hay varios tipos de capas, específicamente la capa normal (Layer.cpp), las cuales tienen todas una superficie como soporte, mientras que el LayerBuffer (mal llamado) no tiene almacenamiento de soporte. pero se puede recuperar de sus clientes…. Tenga en cuenta que el tipo GGLSurface debería haberse llamado GGLBuffer, y las múltiples capas simplemente se componen en el búfer final en su orden Z. Hay varios objetos estrechamente relacionados con el concepto de Superficie: 1. Hay varios objetos estrechamente relacionados con el concepto de Superficie: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java). La aplicación llama indirectamente a este objeto (a través de SurfaceView, ViewRoot, etc.), que necesita crear la superficie (que también crea el lienzo) para poder dibujar gráficos en el objeto y, finalmente, transferirlos a la pantalla. 2. 2.Superficie C++ (frameworks/base/libs/ui/Surface.cpp.). Java Surface llama a este objeto a través de Jni e implementa las funciones de Java Surface. ISurface (y su clase derivada BnSurface). Este objeto es la interfaz entre la aplicación y el servidor. C++ Surface crea esta ISurface (BnSurface) y envía comandos, como actualizar el contenido de la superficie en la pantalla, y el servidor acepta los comandos y realiza las operaciones apropiadas.
La ruta clave para ver el proceso de creación de la superficie es la siguiente: 1. frameworks/base/core/java/android/view/Surface.java Surface::Surface () - 2. frameworks/base/core/jni/android _view_Surface ._view_Surface.cpp --Surface_init(). Cree un objeto SurfaceComposerClient en esta función. 3.frameworks/base/libs/ui/SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient () Esta función es muy importante porque establece un puente entre el cliente y el servidor. Obtenga un objeto IBinder del servidor (con interfaz ISurfaceComposer) a través de la función _get_surface_manager () y luego acceda al servidor a través de procesos a través de la función IBinder. Luego llame a ISurfaceComposer::createConnection() para crear y devolver un IBinder de ISurfaceFlingerClient. 4. frameworks/base/libs/ui/SurfaceComposerClient.cpp: SurfaceComposerClient::createConnection() crea y devuelve un IBinder al servidor. SurfaceComposerClient::createSurface() Esta función llama a la interfaz createSurface de ISurfaceFlingerClient utilizando el IBinder obtenido anteriormente. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface().BClient derivado de ISurfaceFlingerClient. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface ().frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -SurfaceFlinger::createSurface() Esta función crea la capa correspondiente para Surface. En la ruta crítica anterior, 1, 2, 3 y 4 se ejecutan en el proceso del cliente, mientras que 5 y 6 se ejecutan en el proceso del servidor.