Android SurfaceFlinger
文章平均质量分 91
Android SurfaceFlinger相关知识学习笔记。源码部分主要使用的是 Android 13 的源码。
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
c小旭
Android Framework车载智能座舱开发工程师
展开
-
Android SurfaceFlinger——共享内存读写流程(五十五)
通过上一篇文章的介绍,我们知道了应用进程与 SurfaceFlinger 进程之间的跨进程通信最终选择匿名共享内存的方式实现。并了解了共享内存基本使用方法,这里我们继续了解一下共享内存的粗写操作。原创 2024-08-26 09:40:04 · 442 阅读 · 0 评论 -
Android SurfaceFlinger——SF跨进程通信(五十四)
在 Android 系统中,由于每个应用程序默认运行在自己的进程中,为了实现不同应用或同一应用的不同组件之间的交互,就需要跨进程通信(IPC)。而 Socket 通信、Binder 通信和共享内存都是实现进程间通信(IPC)的方式,但它们各有特点和适用场景。原创 2024-08-26 09:39:41 · 373 阅读 · 0 评论 -
Android SurfaceFlinger——Vsync监听逻辑(五十三)
上一篇文章我们介绍了 SurfaceFlinger 发送 Vsync 信号的流程以及信号的相关处理,这里我们来看一下 Vsync 信号的监听回调逻辑。原创 2024-08-08 08:58:04 · 713 阅读 · 0 评论 -
Android SurfaceFlinger——Vsync信号发送(五十二)
通过上一篇文章我们创建了一个 EventThread 线程,并且它持有了 SurfaceFlinger 中 resyncWithRateLimit() 方法的指针。这里我们主要来看一下 EventThread 对信号的处理。原创 2024-08-08 08:57:43 · 1077 阅读 · 0 评论 -
Android SurfaceFlinger——信号同步原理(五十一)
垂直同步(Vertical Synchronization,简称 VSync)是一种用于同步视频信号和显示设备刷新率的技术,以确保视频帧的显示与屏幕的刷新周期相匹配。VSync 对于防止屏幕撕裂(tearing)、保证图像的连贯性和减少输入延迟非常重要。原创 2024-08-07 09:13:19 · 545 阅读 · 0 评论 -
Android SurfaceFlinger——Fence流转状态(五十)
fence 本质上对应上内核中一个文件描述符 sync_file,sync_file 中有一个核心的 fence 结构体,用于预计释放的时间点。所有的 fence 都是以 sync_timeline 为基准进行递增的。sync_timeline 作为内核记录已经渲染屏幕多少个时间点,每一次通过 hwc_set 都会递增一个时间点,并且会尝试的唤醒关联在 sync_timeline 中 active_list 中 sync_pt 的 fence 的阻塞。原创 2024-08-07 09:13:03 · 586 阅读 · 0 评论 -
Android SurfaceFlinger——同步围栏Fence(四十九)
在 Android 的 SurfaceFlinger 组件中,围栏(Fence)是一种用于同步不同系统组件间操作完成的机制。围栏的概念来源于硬件图形加速器(如 GPU)和其他系统服务(如 SurfaceFlinger)之间的同步需求。在图形渲染和显示的过程中,多个组件可能会并发地访问共享资源(如缓冲区),为了确保数据的一致性和操作的正确顺序,就需要一种机制来协调这些操作,这就是围栏的作用。原创 2024-08-06 09:17:21 · 688 阅读 · 0 评论 -
Android SurfaceFlinger——渲染完成帧显示(四十八)
帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)8.准备帧数据以进行显示(同步方式)9.处理显示输出设备的可选重绘闪烁10.结束帧11.将渲染完成的帧缓冲发布到显示设备12.进行渲染缓存设置。原创 2024-08-06 09:16:54 · 703 阅读 · 0 评论 -
Android SurfaceFlinger——渲染结束帧(四十七)
介绍完屏幕重绘闪烁问题处理后,下面就到了整个图像合成的第 10 步,结束帧渲染操作,这里我们就继续分析该流程。1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)8.准备帧数据以进行显示(同步方式)9.处理显示输出设备的可选重绘闪烁10.结束帧11.将渲染完成的帧缓冲发布到显示设备12.进行渲染缓存设置。原创 2024-08-05 09:57:27 · 504 阅读 · 0 评论 -
Android SurfaceFlinger——重绘闪烁处理(四十六)
直接重绘到屏幕:在某些情况下,应用程序直接在屏幕缓冲区上进行绘制,当绘制完成时,新内容立即显示出来,如果绘制速度不够快,用户可能会看到屏幕内容的瞬间变化。双缓冲机制不完善:双缓冲是一种常用的技术,用于减少重绘闪屏。在这种机制下,应用在一个独立的后台缓冲区进行绘制,绘制完成后,后台缓冲区的内容被交换到前台显示。但如果双缓冲的实现不完全,例如在缓冲区交换时出现延迟,或者在绘制过程中部分区域未能正确遮挡,仍然可能导致闪屏。原创 2024-08-05 09:57:03 · 543 阅读 · 0 评论 -
Android SurfaceFlinger——帧数据准备完成(四十五)
上一节我们介绍了准数据准备过程中选择合成策略的同步和异步操作,在选择合成策略完成后还会调用以下两个函数:applyCompositionStrategy:应用合成策略。finishPrepareFrame:完成帧的准备过程。原创 2024-08-01 08:53:48 · 467 阅读 · 0 评论 -
Android SurfaceFlinger——准备帧数据(四十四)
通过前面的文章我们介绍了 SurfaceFlinger 图层合成的整体流程,并且上一篇已经介绍了帧渲染流程的第一步,这里我们继续介绍帧渲染的准备工作——准备帧数据。1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)8.准备帧数据以进行显示(同步方式)9.处理显示输出设备的可选重绘闪烁10.结束帧11.将渲染完成的帧缓冲发布到显示设备12.进行渲染缓存设置。原创 2024-08-01 08:53:31 · 1072 阅读 · 0 评论 -
Android SurfaceFlinger——渲染开始帧(四十三)
开始帧通过前面的文章我们介绍了 SurfaceFlinger 图层合成的整体流程,已经对应步骤的前五步,这里我们开始介绍帧渲染流程的第一步——开始帧。1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)8.准备帧数据以进行显示(同步方式)9.处理显示输出设备的可选重绘闪烁10.结束帧11.将渲染完成的帧缓冲发布到显示设备12.进行渲染缓存设置。原创 2024-07-31 08:51:28 · 980 阅读 · 0 评论 -
Android SurfaceFlinger——合成预测与状态写入(四十二)
计划合成预测前一篇文章我们介绍了 SurfaceFlinger 图层合成的整体流程,并对前两个流程更新色彩配置和更新合成状态进行了介绍,这里我们接着解析下面的流程。1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)8.准备帧数据以进行显示(同步方式)9.处理显示输出设备的可选重绘闪烁10.结束帧11.将渲染完成的帧缓冲发布到显示设备12.进行渲染缓存设置。原创 2024-07-31 08:50:40 · 431 阅读 · 0 评论 -
Android SurfaceFlinger——SF图层合成(四十一)
上一节我们简单介绍了 SurfaceFlinger 中的图层预的流程,这里我们继续往下看,SurfaceFlinger 的真正核心——图层合成。output->present:进行 Layer 合成。原创 2024-07-30 09:07:45 · 691 阅读 · 0 评论 -
Android SurfaceFlinger——SF图层预合成(四十)
为了便于理解,我们假设有一个简单的场景,其中包含一个图层 L,该图层可能有透明、不透明、阴影以及被其他图层覆盖的部分。下面将逐步介绍这些区域是如何计算的。原创 2024-07-30 09:07:25 · 586 阅读 · 0 评论 -
Android SurfaceFlinger——SF图层合成准备(三十九)
SurfaceFlinger 是 Android 系统中负责窗口管理和图像合成的核心组件,它主要负责将多个应用程序的界面(称为图层或表面)合并成一个单一的图像,然后将这个图像输出到显示设备上。原创 2024-07-29 09:35:32 · 778 阅读 · 0 评论 -
Android SurfaceFlinger——缓冲区的消费流程(三十八)
前面介绍了 SurfaceFlinger 对提交帧的处理以及缓冲区的锁定等流程,这里我们看一下 SurfaceFlinger 对缓冲区的消费流程。原创 2024-07-29 09:35:08 · 313 阅读 · 0 评论 -
Android SurfaceFlinger——显示更新与缓冲区锁定(三十七)
上一篇文章介绍了 SurfaceFlinger 中对提交帧的处理流程,在 commit() 函数中处理提交事务,还有两个比较重要的操作,状态更新与缓冲区锁定和更新可视脏区,这里我们就来分析一下这两个流程。原创 2024-07-27 19:16:19 · 476 阅读 · 0 评论 -
Android SurfaceFlinger——SF处理提交帧(三十六)
前两篇文章介绍了缓冲区准备完成的回调流程,最终通知到 SurfaceFlinger 进行进一步的处理,这里我们就来看一下在 SurfaceFlinger 中对提交帧的处理流程。原创 2024-07-27 19:15:56 · 421 阅读 · 0 评论 -
Android SurfaceFlinger——通知消费流程(三十五)
上一篇文章介绍了 onFrameAvailable() 函数的流程,最终回调到了 BLASTBufferQueue 中,这里测处理跟 Android 老版本还是有区别的,在 BLASTBufferQueue 中通过提交事务的方式通知 SurfaceFlinger 进行更新,而不是老版本中的直接调用 SurfaceFlinger 中的对应函数。这里我们就来看一下 提交事务的通知流程。原创 2024-07-26 13:56:40 · 303 阅读 · 4 评论 -
Android SurfaceFlinger——缓冲区入队回调(三十四)
生产者通常是应用程序或服务,负责生成图像数据并填充到 GraphicBuffer 中。例如,一个摄像头应用或游戏引擎会生成每一帧的图像数据,并将这些数据写入 GraphicBuffer。生产者通过 BufferQueueAPI 与 SurfaceFlinger 交互,请求新的缓冲区,写入数据,然后提交(buffer queue)这些缓冲区供 SurfaceFlinger 使用。原创 2024-07-26 13:56:18 · 729 阅读 · 0 评论 -
Android SurfaceFlinger——GraphicBuffer的提交(三十三)
在 SurfaceFlinger 中,我们 dequeueBuffer 和 queueBuffer 是 Surface 控制接口中非常重要的两个函数,分别用于从 Surface 的 BufferQueue 中取出缓冲区和向 BufferQueue 提交(队列)缓冲区。这两个函数在生产者和消费者模型中扮演着核心角色,确保了图像数据的高效和有序传输。上一篇文章我们已经介绍了 dequeueBuffer() 函数,这里我们就来看一下 queueBuffer() 函数。原创 2024-07-25 09:31:46 · 749 阅读 · 0 评论 -
Android SurfaceFlinger——GraphicBuffer的生成(三十二)
通过前面的学习我们知道,在 SurfaceFlinger 中使用的生产者/消费者模型,Surface 做为生产者一方存在如下两个比较重要的函数:dequeueBuffer:获取一个缓冲区(GraphicBuffer),也就是 GraphicBuffer 生成。queueBuffer :把缓冲区(GraphicBuffer)放入缓冲队列中。这里我们就先来看看 dequeueBuffer() 函数,该函数通常由生产者调用,用于从 BufferQueue 中取出一个缓冲区以供渲染。原创 2024-07-25 09:31:24 · 960 阅读 · 0 评论 -
Android SurfaceFlinger——GraphicBuffer获取内存信息(三十一)
上一篇文章介绍了 GraphicBuffer 初始化的 initWithSize() 函数中的申请内存流程,这里我们看一下另一个比较重要的函数,GraphicBufferMapper. getTransportSize 获取内存信息。该函数通常在需要了解缓冲区的实际内存占用情况时调用,例如在调试内存使用情况或优化性能时。原创 2024-07-24 08:56:37 · 3031 阅读 · 0 评论 -
Android SurfaceFlinger——GraphicBuffer内存申请(三十)
在Android的图形子系统中,GraphicBufferAllocator 和 GraphicBufferMapper 是处理图形缓冲区的核心组件。这两个类分别负责缓冲区的分配和映射,是 GraphicBuffer 类的基础,GraphicBuffer 用于封装和管理图形数据。原创 2024-07-24 08:56:18 · 1348 阅读 · 0 评论 -
Android SurfaceFlinger——GraphicBuffer初始化(二十九)
GraphicBuffer 对象封装了一块内存,这块内存可以用于存储像素数据,例如图像帧或者视频帧。它提供了跨进程传输的能力,使得不同进程之间可以共享同一块图形数据。简单来说,GraphicBuffer 是实现图形内容在硬件和软件层面上存储和传递的具体实现。原创 2024-07-23 08:56:18 · 1156 阅读 · 0 评论 -
Android SurfaceFlinger——纹理的绘制流程(二十八)
在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。纹理本质上是一块内存区域,用于存储图像数据,如位图、颜色缓冲区等,这些数据可以被 GPU 直接访问和操作。在 SurfaceFlinger 的上下文中,纹理扮演着图像源的角色,它是图形渲染的基本构建块之一。应用程序通过 Surface 将内容提交给 SurfaceFlinger,这些内容最终会被封装成纹理,供 GPU 进行高效的渲染和合成操作。原创 2024-07-23 08:55:50 · 752 阅读 · 0 评论 -
Android SurfaceFlinger——关联EGL三要素(二十七)
经过前面的几篇文章我们呢了解了系统启动动画的播放流程,这里我们对 OpenGL ES 初始化流程总结如下:eglGetDisplay:加载 OpenGL ES 的 so 库,获取一个屏幕句柄对象。此时的 EGLDisplay 其实就是 egl_display_t,并且保存在数组中。eglInitialize:设置了EGLDisplay 的状态,同时初始化着色器缓存。eglChooseConfig:获取当前 OpenGL es 提供的参数中最佳参数。原创 2024-07-22 09:25:11 · 2301 阅读 · 0 评论 -
Android SurfaceFlinger——创建EGLContext(二十六)
前面文章我们获取了 EGL 的最优配置,创建了 EGLSurface 并与 Surface 进行了关联,然后还需要获取 OpenGL ES 的上下文 Context,这也是 EGL 控制接口的三要素(Displays、Contexts 和 Surfaces)之一。1)getInternalDisplayToken:获取显示屏的 SurfaceControl 令牌(Token)。2)getActiveDisplayMode:获取当前激活(正在使用中)的显示模式信息。原创 2024-07-22 09:20:52 · 1005 阅读 · 0 评论 -
Android SurfaceFlinger——本地窗口连接EGL API(二十五)
通过前面的文章我们属性了 Surface 和 EGLSurface 的相关内容,这里我们继续分析让两者相关联的函数 native_window_api_connect()。原创 2024-07-04 08:43:55 · 442 阅读 · 0 评论 -
Android SurfaceFlinger——创建EGLSurface(二十四)
EGLSurface 是 EGL(Embedded Graphics Library)接口中的一个核心概念,它是 OpenGL ES 或 OpenVG 等图形 API 与底层原生窗口系统之间的桥梁。EGLSurface 代表了图形数据将要被渲染到的目标表面,这个目标可以是屏幕上的一个窗口区域、一个离屏缓冲区,或者是其他形式的显示设备。原创 2024-07-04 08:43:18 · 623 阅读 · 0 评论 -
Android SurfaceFlinger——屏幕状态初始化(二十三)
对于开机启动动画前期准备的相关步骤,我们已经分析了前 5 个,对于第 6 步调用 eglGetDisplay() 函数对 OpenGL ES 初始化并获取默认屏幕,我们在介绍 OpenGL ES 的时候也进行了详细的分析,下一步我们我们来分析对屏幕的状态进行初始化。1)getInternalDisplayToken:获取显示屏的 SurfaceControl 令牌(Token)。2)getActiveDisplayMode:获取当前激活(正在使用中)的显示模式信息。原创 2024-07-03 08:54:19 · 1209 阅读 · 0 评论 -
Android SurfaceFlinger——创建缓冲队列(二十二)
BLASTBufferQueue 是 Android 系统中用于图形缓冲区管理的一个重要组件,它是在 Android 12(代号为S)中引入的。在 Android 的图形显示系统中,BufferQueue 被用来协调生产者和消费者之间的缓冲区交换。然而,传统的 BufferQueue 实现涉及到了复杂的跨进程通信(IPC),这可能会成为性能瓶颈,尤其是在高帧率显示和复杂 UI 动画场景下。BLASTBufferQueue 目的是为了减少 IPC 的开销并提高效率。原创 2024-07-03 08:53:58 · 918 阅读 · 0 评论 -
Android SurfaceFlinger——创建Surface(二十一)
其实整个过程就是图元缓冲队列的初始化流程。在这个初始化流程中,初步的搭建了整个生产者-消费者模型。剩下的步骤就是生产图元,写入生产者,生产者把数据写进缓冲队列,通知消费者进行消费。createSurface 通过 SurfaceFlinger 的 Client 对象创建了一个图元生产者,并且赋值给 SurfaceControl 中。setLayer 设置 layer 图层在 Z 轴上的层级。原创 2024-07-02 11:16:54 · 814 阅读 · 0 评论 -
Android SurfaceFlinger——创建Layer(二十)
上一篇文章介绍到,SurfaceComposerClient 中的 createSurface() 方法最终创建的是一个 Layer,这里我们接着看 Layer 的创建。原创 2024-07-02 11:16:29 · 3235 阅读 · 1 评论 -
Android SurfaceFlinger——Surface和Layer介绍(十九)
在 Android 系统中,SurfaceFlinger 是负责屏幕合成的核心组件,它管理并组合来自不同应用程序和服务的图形输出,最终将这些输出呈现到物理屏幕上。Surface 是 Android 图形系统中的一个核心概念,它是应用程序与 SurfaceFlinger 之间交互的基础。图形缓冲区:Surface 本质上是一个共享的、可被多个进程访问的图形缓冲区,它代表了用于绘制图形的内存区域。每个 Surface 都可以看作是一个可以被绘制到的“画布”。窗口与界面。原创 2024-07-01 17:23:21 · 1453 阅读 · 0 评论 -
Android SurfaceFlinger ——获取显示屏信息(十八)
经过前面文章对开机启动动画的流程梳理,引出了实际上在开机启动动画中,并没有Activity,而是通过 OpenGL es 进行渲染,最后通过某种方式,把数据交给 Android 渲染系统。让我们回忆一下开机动画前期准备的相关步骤,大致分为如下几个:1)getInternalDisplayToken:获取显示屏的 SurfaceControl 令牌(Token)。2)getActiveDisplayMode:获取当前激活(正在使用中)的显示模式信息。原创 2024-07-01 17:23:00 · 508 阅读 · 0 评论 -
Android SurfaceFlinger——动画进程销毁(十七)
在动画播放完成后,对动画相关资源释放的同时还需要销毁动画进程。这里我们就来分析一下动画进程的销毁流程。原创 2024-06-27 08:57:14 · 3473 阅读 · 1 评论 -
Android SurfaceFlinger——动画播放流程(十六)
前两篇文章介绍了系统启动动画服务的启动和准备阶段,并且我们选择了自定义动画的分支,该分支的动画播放流程主要包含一下几个阶段:loadAnimation:解析 zip 包的动画数据。playAnimation:播放解析好的纹理数据。releaseAnimation:播放完毕释放资源。原创 2024-06-27 08:56:50 · 419 阅读 · 0 评论