当前位置: 首页 > news >正文

Android显示系统(10)- SurfaceFlinger内部结构

一、前言:

之前讲述了native层如何使用SurfaceFlinger,我们只是看到了简单的API调用,从本文开始,我们逐步进行SurfaceFlinger内部结构的分析。话不多说,莱茨狗~

二、类图:

2.1、总体架构:

先看下SurfaceFlinger的关键成员和我们BootAnimation侧关键成员如何对应起来,这不是严格的UML类图,但是这么画我觉着很容易理解,就先这么画了。
在这里插入图片描述

可以看出:

  • SurfaceFlinger侧会为BootAnimation创建一个Client,其实,SF会为每个APP都创建一个Client;
  • SurfaceFlinger侧有一个BufferQueueLayer(Layer的子类)对应APP侧的SurfaceControl,允许有一个APP有多个Layer,同时,SF会生成多个SurfaceControl
  • BufferQueueLayer是一个buffer队列,队列有一个消费者mConsumer和一个生产者mProducer
  • APP侧的SurfaceControl当中有一个Surface
  • Surface当中又有一个数组mSlots表示64个buffer,对应SF当中其实也有这么一个数组,如果数组来管理这些buffer,这个是比较复杂的流程,后面单独写一篇文章介绍;

2.2、代理关系:

上面看到好多类似于SurfaceCompser的字眼,到底啥关系呢?我给你画个图:

在这里插入图片描述

熟悉Binder机制的朋友都应该能看懂,Bpxxxx一般就是代理类,Bnxxxx一般就是本地类,这样APP侧调用mClient就像调用Client一模一样的,底层Binder帮你处理了。一种RPC的思想。

三、APP连接SurfaceFlinger:

前面画了静态的类图,接下来我们看下APP如何去和SurfaceFlinger建立连接。

  1. APP侧获得SurfaceFlinger服务:

    • BootAnimation构造函数中,我们会通过mSession = new SurfaceComposerClient();来获取SF的代理类。

      BootAnimation::BootAnimation(sp<Callbacks> callbacks): Thread(false), mClockEnabled(true), mTimeIsAccurate(false),mTimeFormat12Hour(false), mTimeCheckThread(

http://www.mrgr.cn/news/80018.html

相关文章:

  • C++ webrtc开发(非原生开发,linux上使用libdatachannel库)
  • 【C#】int? , C# 中的可空类型(Nullable Types)
  • prometheusgrafana实现监控告警
  • 深度学习中的数学基础【学习笔记】——第六章:随机变量
  • Playwright中Page类的方法
  • 蓝桥杯我来了
  • 【常考前端面试题总结】---2025
  • ansible自动化运维(三)jinja2模板roles角色管理
  • uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能
  • 【数据结构进阶】AVL树深度剖析 + 实现(附源码)
  • 【电机控制器】FM33LF015芯片——FLASH模拟EEPROM
  • 黑皮书-计算机科学导论02
  • react-dnd 拖拽事件与输入框的文本选中冲突
  • Opencv之图像添加水印
  • HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装
  • SAP FICO物料分类账
  • 任务4 DNS服务配置与管理
  • ubuntu22.04 使用crash
  • SpringBoot 手动实现动态切换数据源 DynamicSource (中)
  • 【大前端vue:组件】鼠标上移 出现动画
  • pyfink1.20版本下实现消费kafka中数据并实时计算
  • 【架构】从 Socket 的角度认识非阻塞模型
  • xshell连接虚拟机,更换网络模式:NAT->桥接模式
  • 网络基础 - TCP/IP 五层模型
  • 爬虫基础知识点
  • 设计模式——Singleton(单例)设计模式