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

Android12 显示框架之SurfaceComposerClient创建

目录:Android显示终极宝典

SurfaceComposerClient是应用程序与SurfaceFlinger交互的客户端接口,在SurfaceFlinger服务端与之对应的名叫Client。SurfaceComposerClient和Client构成了应用程序和SurfaceFlinger之间进行交互的桥梁。每个SurfaceComposerClient在SurfaceFlinger都有一个Client实例一一对应,大概就如下面图里的样子。

应用程序要想创建surface并渲染图像提交合成显示等,第一步肯定要创建SurfaceComposerClient。

接下来就看看SurfaceComposerClient的创建过程。

new SurfaceComposerClient()

//frameworks/native/libs/gui/SurfaceComposerClient.cpp
SurfaceComposerClient::SurfaceComposerClient(): mStatus(NO_INIT)
{
}void SurfaceComposerClient::onFirstRef() {sp<ISurfaceComposer> sf(ComposerService::getComposerService());if (sf != nullptr && mStatus == NO_INIT) {sp<ISurfaceComposerClient> conn;conn = sf->createConnection();if (conn != nullptr) {mClient = conn;mStatus = NO_ERROR;}}
}

SurfaceComposerClient构造函数啥也没做,主要工作都放在onFirstRef()中完成的。这里的ComposerService存在的意义是为了获取SurfaceFlinger的客户端代理,而刻意去隐藏这个获取的过程。然后直接调用SurfaceFlinger的createConnection()功能。

createConnection()

//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {const sp<Client> client = new Client(this);return client->initCheck() == NO_ERROR ? client : nullptr;
}//frameworks/native/services/surfaceflinger/Client.cpp
Client::Client(const sp<SurfaceFlinger>& flinger): mFlinger(flinger)
{
}

目的很单纯,在SurfaceFlinger中创建一个Client,并且通过binder将它传到应用端保存起来。为什么要返回到应用端保存?一是以为这么做对应用来说只是举手之劳而且很合理,二是因为放在SurfaceFlinger中去一一甄别只会增大SurfaceFlinger的复杂度而得不偿失。Client与应用程序是一一绑定的,应用程序每次访问SurfaceFlinger时把它作为参数传递进来,SurfaceFlinger自然就知道是谁。

简单画个图总结一下:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • element的el-autocomplete带输入建议搜索+搜索匹配文字高亮显示
  • 前端开发:Vue2.0桌面组件库-Element
  • 【音视频之SDL2】Windows配置SDL2项目模板
  • 【数据集处理】Polars库、Parquet 文件
  • GO-学习-02-常量
  • 【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)
  • js_拳皇(下)
  • 「树形结构」基于 Antd 实现一个动态增加子节点+可拖拽的树
  • ArduPilot开源代码之lida2003套机+伴机电脑外场
  • 前端 socket.io 跨域
  • 【Go - context 速览,场景与用法】
  • 解析西门子PLC的String和WString
  • 套接字选项、单播、广播和多播
  • 高效恢复误删文件:2024年数据恢复工具
  • 在 Jetpack Compose 中使用 CameraX示例
  • Angular Elements 及其运作原理
  • golang中接口赋值与方法集
  • HTTP 简介
  • SwizzleMethod 黑魔法
  • vue的全局变量和全局拦截请求器
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 手写一个CommonJS打包工具(一)
  • 微信开源mars源码分析1—上层samples分析
  • 运行时添加log4j2的appender
  • Nginx实现动静分离
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • !!Dom4j 学习笔记
  • $$$$GB2312-80区位编码表$$$$
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (11)MSP430F5529 定时器B
  • (day 12)JavaScript学习笔记(数组3)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三分钟)速览传统边缘检测算子
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)scrum常见工具列表
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .equals()到底是什么意思?
  • .net 7和core版 SignalR
  • .net Application的目录
  • .net FrameWork简介,数组,枚举
  • .NET 设计模式初探
  • .net的socket示例
  • .net中生成excel后调整宽度
  • :“Failed to access IIS metabase”解决方法
  • @NestedConfigurationProperty 注解用法
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945