大连普兰店网站建设三丰云做网站教程
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:30
当前位置: 首页 > news >正文
大连普兰店网站建设,三丰云做网站教程,附近网站电脑培训班,wordpress 加图片字段一、基础介绍 SurfaceFlinger 是 Android 系统中的一个关键组件#xff0c;负责管理屏幕显示的合成和渲染。 服务角色#xff1a;SurfaceFlinger 作为一个系统服务独立运行#xff0c;它不依赖于任何应用程序进程#xff0c;而是由系统启动并持续运行。窗口管理#xff1a…一、基础介绍 SurfaceFlinger 是 Android 系统中的一个关键组件负责管理屏幕显示的合成和渲染。 服务角色SurfaceFlinger 作为一个系统服务独立运行它不依赖于任何应用程序进程而是由系统启动并持续运行。窗口管理它管理着系统中所有窗口的层次结构包括应用程序窗口、状态栏、导航栏等并根据ZOrder深度顺序决定哪些窗口应该在前面显示。合成操作SurfaceFlinger 接收各个窗口的 Surface图形缓冲区这些 Surface 可能来自不同的应用程序或系统服务。根据每个 Surface 的透明度、大小、位置等属性SurfaceFlinger 计算它们在最终显示图像中的位置和效果。硬件加速SurfaceFlinger 利用硬件加速功能如 GPU来高效地执行合成操作。它可以与 HWComposer硬件作曲家协同工作优化显示性能和功耗。帧缓冲区操作合成后的图像被写入到帧缓冲区然后由显示硬件读取并呈现到屏幕上。多显示器支持SurfaceFlinger 还支持多显示器配置能够将内容正确地输出到连接到设备的多个显示设备上。低延迟渲染为了实现流畅的用户体验SurfaceFlinger 致力于减少帧之间的延迟确保以 60Hz 或其他刷新率连续显示内容。与其他组件的交互与 WMSWindow Manager Service协作处理窗口的布局和可见性。与 Content Providers、View System 等其他 Android 组件进行通信获取和更新显示内容。权限控制SurfaceFlinger 还负责权限控制确保只有授权的进程可以访问和修改显示内容。 通过上述功能SurfaceFlinger 在 Android 系统中扮演着至关重要的角色确保了用户界面的正确显示和高效的渲染。 二、系统渲染流程 1、SurfaceFlinger SurfaceFlinger 是整个 Android 系统渲染的核心进程。所有应用的渲染逻辑最终都会来到 SurfaceFlinger 中进行处理最终会把处理后的图像数据交给 CPU 或者 GPU 进行绘制。 在这个过程中 SurfaceFlinger 并非担当渲染的角色而是作为图元抛射机一样把所有应用进程传递过来的图元数据加工处理后交给 CPU 和 GPU 做真正的绘制。 2、Surface 在每一个应用中都以 Surface 作为一个图元传递单元向 SurfaceFlinger 这个服务端传递图元数据。 Surface 与 SurfaceFlinger 交互流程如下图所示 3、设计思想 SurfaceFlinger 是以生产者以及消费者为核心设计思想把每一个应用进程作为生产者生产图元保存到 SurfaceFlinger 的图元队列中SurfaceFlinger 则作为消费者依照一定的规则把生产者存放到 SurfaceFlinger 中的队列一一处理。 SurfaceFlinger 处理 Surface 流程如下 4、共享内存 为了能够跨进程的传输大容量的图元数据使用了匿名共享内存内存作为工具把图元数据都输送到 SurfaceFlinger 中处理。 我们要知道从应用进程把图元数据传输到 SurfaceFlinger 进程中处理就需要跨进程通信这里我们能想到的就是 socket通信、Binder 通信以及共享内存了。对于 Ashmem 匿名共享内存的选择后面我们详细讲解。 5、时间钟 SurfaceFlinger 底层有一个时间钟在不断的循环或从硬件中断发出或从软件模拟发出计时唤起每隔一段时间都会获取 SurfaceFlinger 中的图元队列通过 CPU/GPU 绘制在屏幕。 这个时间钟很符合 Android 系统的设计情况除了需要 Android 应用有办法通知 SurfaceFlinger 需要渲染的模式也需要 SurfaceFlinger 在不断的处理图元数据并绘制到屏幕的同时回调信息给自身。 其中 EventThread 扮演一个极其重要的角色在 SurfaceFlinger 中设计大致如下 三、缓冲原理 在了解缓冲原理前我们先来开一个比较重要的概念——垂直同步信号VSync。 1、垂直同步信号 在 SurfaceFlinger 中垂直同步信号Vertical Synchronization, VSync起着核心作用确保图形渲染和屏幕显示的同步避免画面撕裂现象并提高视觉流畅性。 作用原理VSync 是一种同步机制与显示器的刷新周期对齐指示何时开始新的一帧渲染最合适。每当显示器完成一次刷新周期硬件会产生一个 VSync 信号通知系统现在可以安全地开始绘制下一帧图像。硬件与软件的结合虽然早期的 SurfaceFlinger 可能依赖于软件模拟 VSync现代 Android 系统通常利用硬件提供的精确 VSync 信号以减少误差和提升效率。分发与接收SurfaceFlinger 负责接收硬件产生的 VSync 信号并将其分发给系统中的渲染器包括 App 的 UI 线程和 SurfaceFlinger 自身。onVSyncReceived 方法会在接收到 VSync 信号时被调用该方法内部会触发一系列的渲染调度操作。同步渲染应用程序通过 Choreographer编舞者类监听 VSync 信号确保 UI 绘制与屏幕刷新同步。这使得 AppUI 和 SurfaceFlinger 都能按照硬件 VSync 的节奏进行工作从而保证动画和滚动等操作的平滑性。减少延迟与提高效率通过精确的 VSync 同步可以减少由于无序渲染导致的额外缓冲需求降低输入到显示的延迟。VSync 还帮助优化 CPU 和 GPU 的利用率避免过度渲染或空闲等待进而节省电池。可调节性在某些场景下开发者可以通过调整 Choreographer 的行为来适应特定的渲染需求比如三重缓冲策略的调整。异常处理与校准SurfaceFlinger 还涉及处理 VSync 信号的异常情况比如信号丢失或频率不匹配以维持系统的稳定性和显示质量。 综上所述VSync 在 SurfaceFlinger 中是确保图形显示流畅和高效的基石通过精确的时间控制协调系统资源提供最佳的用户体验。 2、双缓冲 在 SurfaceFlinger 中双缓冲是一种优化显示性能的技术用于减少屏幕闪烁并提高动画的平滑性。 缓冲区管理双缓冲涉及到两个独立的帧缓冲区front buffer 和 back buffer。前缓冲区是当前显示在屏幕上的图像而后缓冲区则用于绘制新的内容。绘制过程应用程序在后台缓冲区完成绘制操作不会影响到正在显示的图像。当绘制完成后SurfaceFlinger 会收到 VSync 信号此时可以安全地交换前后缓冲区。缓冲区交换在 VSync 时刻SurfaceFlinger 将后缓冲区的内容复制到前缓冲区这个过程称为翻页或PageFlip。这个操作通常是原子性的确保在屏幕刷新时看到的是完整的一帧而不是部分更新的内容。减少闪烁因为用户看到的始终是已经完成绘制的图像而不是正在绘制的过程所以避免了因多次绘制导致的闪烁现象。提高效率应用程序可以同时在后缓冲区进行下一帧的绘制而前一帧的显示不会受到影响这提高了渲染效率。 简单来说双缓冲就是渲染第一帧的同时已经在绘制第二帧的内容等到第二帧绘制完毕后就显示出来。这么做的好处很明显如果一帧画完才开始画下一帧势必有一个计算的过程导致 ui 交互迟缓。 双缓冲是 SurfaceFlinger 在处理多个窗口和动画时的关键技术它确保了 Android 系统的视觉流畅性和稳定性。通过与 VSync 信号的配合双缓冲有效地减少了画面撕裂和不连续的视觉效果提升了用户体验。 通过这种方式显示前一帧的时候提前绘制好下一帧图元放在背后等待时机交换这样就能从感官上流畅不少。 这么做的效果十分显示但是怎么找到一个合适的时机进行交换前后两帧这是一个问题如果按照屏幕刷新频率来一般按照通用屏幕刷新 60fps 也就是约 16ms 刷新一次即可。但是我们深入思考一下其实这个过程中有两个变量一个是绘图速度一个是显示速度。就算是绘图速度中也有分 CPU 和 GPU 的绘制速度。 这里我看一下当年 google 在“黄油计划”示意图。 无缓冲流程 理想中的情况就是上图在显示第 0 帧的时候CPU/GPU 合成绘制完成第 1 帧在 16ms 内当 vsync 信号来了就把第 1 帧交换到显示屏显示。 但是很可能出现下面这种情况CPU 因为繁忙来不及显示完第一帧的时候还没空渲染第二帧就算 SurfaceFlinger 接受到了 Vsync 的信号也只能拿出已经渲染好的第一帧显示在屏幕上。这样就重复显示了第一帧Google 开发团队称这种为 jank。 能看到显示第一帧因为第二帧没准备好只能重复显示第一帧了。再来看看双缓冲的工作原理流程。 双缓冲流程 可以看到此时就不是简单的第一第二帧而是分为 A 缓冲B 缓冲。能看到在正常情况下先显示 A 缓冲的内容同时准备B缓冲当一切正常的时候B 缓冲应该在下一个 vsync 来之前准备好一旦 vsync 到来则显示 B 缓冲A 缓冲回到后台继续绘制。 那么这种方式一旦遇到 jank 会是什么样的一个情况。 如果是双缓冲好像没有问题但是一旦出现 jank 了之后之后显示屏就会不断的出现 jank。如果缓冲 A 在显示而 B 准备的时间超过 16ms就会导致 A 缓冲区重复显示而当 B 显示的时候A 也很可能准备时间不足 16ms 导致无法绘制完成只能重复显示 B 缓冲的内容。 这种方式更加的危险为了解决这个问题Google 引入三重缓冲。 3、三重缓冲 在 SurfaceFlinger 中三重缓冲Triple Buffering是双缓冲的一个扩展旨在进一步减少画面撕裂和提高渲染性能特别是在高帧率和垂直同步V-Sync启用时。 缓冲区数量与双缓冲的两个缓冲区不同三重缓冲使用三个独立的帧缓冲区。当前显示的前缓冲区、一个用于绘制的新缓冲区后缓冲区以及一个额外的中间缓冲区。渲染流程应用程序在中间缓冲区完成新帧的渲染同时前缓冲区正在屏幕上显示。当前帧绘制完成后SurfaceFlinger 等待下一个 VSync 信号然后将中间缓冲区的内容移动到后缓冲区。缓冲区交换在下一个 VSync 到来时SurfaceFlinger 将后缓冲区的内容复制到前缓冲区同时释放中间缓冲区供应用程序绘制下一帧。这样应用程序可以在前一帧显示的同时开始绘制下一帧而不是等待前一帧完全呈现后再开始。减少延迟三重缓冲减少了等待 VSync 信号的空闲时间因为总有一个缓冲区可供应用程序使用从而降低了帧间延迟。性能提升在某些情况下尤其是在高帧率下三重缓冲可以减少因等待 VSync 而引起的帧率下降从而提供更稳定的帧率表现。权衡尽管三重缓冲可以提高性能但它也增加了内存占用因为需要存储额外的缓冲区。此外对于某些设备或应用场景双缓冲可能已经足够而且更节省资源。适用场景三重缓冲通常在需要高性能图形渲染、高刷新率显示器或者需要减少 V-Sync 带来的延迟时采用。 三重缓冲是 SurfaceFlinger 为了优化高动态场景和减少延迟而采用的一种策略它在现代游戏和高性能应用中尤其有用能够提供更加流畅的视觉体验。 三重缓冲处理 jank 的原理流程图 可以看到为了避免后面连锁式的错误引入三重缓冲就为了让空闲出来的等待时间能够做更多的事情。就如同双缓冲遇到 jank 之后一旦 B 缓冲 CPUGPU 的时间超过了下一个 vsync 的时间能够发现其实 CPU 和 GPU 有一段时间都没有事情做光等待下一次 Vsync 的到来才会导致整个系统后面的绘制出现连锁式的出现 jank。 而三缓冲的出现在重复显示 A 缓冲区的时候CPU 不会光等待而是会准备 C 缓冲区的图元之后就能把 C 缓冲区接上。这就是 Google 所说的三重缓冲区的来源不过绝大多数情况下的缓冲策略都是由 SurfaceFlinger 系统自己决定的。实际上这种方式也可以用到音视频的编写优化里面常用的缓冲区设计和这里也有异曲同工之处。 有了缓冲原理的介绍这里我们再来回顾一下上面的时间钟。其实每一次 Vsync 从硬件/软件过来的时候Dispsync 都会尝试着通知 SurfaceFlinger 和APP这是完全没有问题而后面那个 Phase 相位又有什么作用这就是系统的设计的巧妙我们如果同时把信号通知同时告诉 APP 和 SurfaceFlinger 会导致什么结果 如果此时 APP 后返回了图元但是 SurfaceFlinger 已经执行了刷新合成绘制行为很有可能因为 APP 到 SurfaceFlinger 传输图元速度必定比 SurfaceFlinger 自己通知自己慢此时就会导致类似 jank 的问题导致下一个 vsync 还是显示当前帧数因此需要如下一个时间差先通知 APP 后通知 SurfaceFlinger如下图 加上这个理解就能明白上面 Phase 相位处理的初衷了。 总结 对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想我们阅读 SurfaceFlinger 的难度就会下降不少。 下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。 framework 面向开发者所有的 View 是便于开发的控件里面仅仅只是提供了当前 View 各种属性以及功能。而 Android 底层的 Skia 是 Android 对于屏幕上的画笔经过 View 绘制流程的 onDraw 方法回调把需要绘制的东西通过 Skia 绘制成像素图元保存起来SurfaceFlinger 则是最后接受 Skia 的绘制结果最后绘制到屏幕上。 所以说Skia 是 Android 渲染核心但是最终还是需要 Skia 和系统所提供起来才是一个 Android 完整渲染体系。经过这一层层的屏蔽让开发者不需要对 Android 底层的渲染体系有任何理解也能绘制出不错的效果。 最后会把绘制结果传输到屏幕中。
- 上一篇: 大连品牌官网建站做平面素材比较好的网站
- 下一篇: 大连企业网站开发app网站做二手交易
相关文章
-
大连品牌官网建站做平面素材比较好的网站
大连品牌官网建站做平面素材比较好的网站
- 技术栈
- 2026年03月21日
-
大连模板建站软件偃师网站制作
大连模板建站软件偃师网站制作
- 技术栈
- 2026年03月21日
-
大连零基础网站建设教学在哪里男朋友说是做竞彩网站维护的
大连零基础网站建设教学在哪里男朋友说是做竞彩网站维护的
- 技术栈
- 2026年03月21日
-
大连企业网站开发app网站做二手交易
大连企业网站开发app网站做二手交易
- 技术栈
- 2026年03月21日
-
大连企业网站设计网络营销渠道可以分为
大连企业网站设计网络营销渠道可以分为
- 技术栈
- 2026年03月21日
-
大连企业做网站公司排名农业咨询平台网站建设方案
大连企业做网站公司排名农业咨询平台网站建设方案
- 技术栈
- 2026年03月21日






