渲染机制原理之一——Surface & SurfaceFlinger


Android 系统采用一种称为 Surface 的 UI 架构为应用程序提供用户界面。
Android 应用程序调用 SurfaceFlinger 服务把经过测量、布局和绘制后的 Surface 渲染到显示屏幕上。

1.Surface & SurfaceFlinger

2.Surface与SurfaceFlinger关系图

在 Android 应用程序中,每一个 Activity 组件都关联有一个或者若干个窗口,每一个窗口都对应有一个 Surface。有了这个 Surface 之后,应用程序就可以在上面渲染窗口的 UI。最终这些已经绘制好了的 Surface 都会被统一提交给 Surface 管理服务 SurfaceFlinger 进行合成,最后显示在屏幕上面。无论是应用程序,还是 SurfaceFlinger,都可以利用 GPU 等硬件来进行 UI 渲染,以便获得更流畅的 UI。
在这里插入图片描述

3.渲染机制类图

在这里插入图片描述

4.渲染机制交互图

在这里插入图片描述

5.渲染中遇到的坑

1. 7.0+ View.Post的失效

5.巨人肩膀

1.Android之Surface绘制原理
2.Android 渲染机制——原理篇(显示原理全过程解析)
3.View.post() 不靠谱的地方你知道多少

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 12 中,SurfaceFlinger 的主线程会定期扫描系统中所有的 Surface 对象,并检查它们的状态是否发生了改变。这个过程是由主线程的消息循环和 Surface 对象列表实现的。 具体来说,主线程会执行一个消息循环,等待收到消息后进行处理。当主线程收到“刷新”消息时,它会遍历 Surface 对象列表,并依次检查每个 Surface 对象的状态是否发生了改变。这个过程是通过遍历Surface 对象列表来实现的,每个 Surface 对象都有自己的状态,包括其位置、大小、透明度、缩放等等。主线程会检查每个 Surface 对象的状态,并确定是否需要更新该 Surface 对象的缓冲区。 具体实现的代码位于 `SurfaceFlinger::onMessageRefresh` 函数中,这是主线程的消息处理函数,当主线程收到“刷新”消息时,就会调用该函数。下面是伪代码: ```cpp void SurfaceFlinger::onMessageRefresh() { // 遍历所有的 Surface 对象,并检查它们的状态是否发生了改变 for (auto& layer : mCurrentState.layersSortedByZ) { // 调用每个 Surface 对象的 onPreComposition 方法来检查它们的状态 layer->onPreComposition(); } // 如果某个 Surface 对象的状态发生了改变,就通知客户端进程重新提交缓冲区 postComposition(); // 将所有的 Surface 对象缓冲区合成到一个帧缓冲区中,并添加虫洞层 composeSurfaces(); drawWormhole(); } ``` 在这个函数中,`mCurrentState.layersSortedByZ` 是 Surface 对象列表,`layer->onPreComposition()` 方法会检查 Surface 对象的状态并更新其缓冲区,`postComposition()` 方法会通知客户端进程重新提交缓冲区,`composeSurfaces()` 和 `drawWormhole()` 方法会将所有的 Surface 对象缓冲区合成到一个帧缓冲区中,并添加虫洞层用于处理透明度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值