Surfacefinger——threadLoop主循环 (zt)

SurfaceFlinger详解 SurfaceFlinger的定义那么 Systrace 中,我们关注的重点就是上面这幅图对应的部分这四部分,在 Systrace 中都有可以对应的地方,以时间发生的顺序排序就是 1、2、3、4,下面我们从 Systrace 的这四部分来看整个渲染的流程。负责图像合成的核心模块是 负责图像合成的节奏和合成策略的分配。 阅读详情
查看文章
  
转载自 http://blog.sina.com.cn/s/blog_6e0c17b90100pm5f.html

Surfacefinger——threadLoop主循环
2010-12-16 17:56

Surfacefinger——threadLoop主循环

1Surfaceflinger线程
 Surfaceflinger是一个类,同时又是线程,该线程通过循环,不断计算并刷新当前屏幕需要的显示内容。Surfaceflinger线程属于SystemServer进程,也就是在SystemServer进程中启动了Surfaceflinger线程。
 Surfaceflinger中保存着各种layer,其主要工作就是负责各种layer的融合,因此可看做一个用于维护各种layer的线程。
 启动Android线程需要提供两个接口,一是readyToRun(),该函数定义了线程循环前需要初始化的内容;二是threadLoop(),每个线程都必须实现,该函数定义了线程执行的内容,如果该函数返回true,线程会继续调用threadLoop(),如果返回false,线程将退出。

2初始化
 Surfaceflinger类的构造函数会执行init(),该函数输出Surfaceflinger启动信息,并配置一些调试信息。接着执行readyToRun(),初始化整个显示系统。
 readyToRun()调用过程如下:
 (1)执行newDisplayHardware(this,dpy),通过DisplayHardware初始化Framebuffer、EGL并获取OpenGLES信息。
 (2)创建共享的内存控制块。
 (3)将EGL与当前屏幕绑定。
 (4)初始化共享内存控制块。
 (5)初始化OpenGLES。
 (6)显示开机动画。

3核心数据结构
 State          mCurrentState;  
 当前更新的状态
State          mDrawingState; 
正在屏幕上绘制的状态
LayerVector    layersSortedByZ; 
保存layer的列表,类似于Z轴,mCurrentState和mDrawingState分别拥有一个列表。

4主循环threadLoop()
 通过流程图可以看到threadLoop()都做了哪些操作。
 

4.1waitForEvent函数
 waitForEvent函数将超时时间设置为5秒钟,并等待系统事件发生。在超时前若有事件发生则立即返回,若发生超时将输出警告信息,上层一般会处理这个问题。
4.2handleConsoleEvents函数
 该函数被执行的几率较低,主要用于处理控制台事件。
4.3handleTransaction函数
 该函数将遍历Surfaceflinger拥有的每一个layer,检查是否有layer的属性改变,主要执行以下工作:
 (1)获取mCurrentState.layersSortedByZ及layer的数目。
 (2)遍历所有layer,获取layer对应的参数,判断是否有layer的属性改变和是否有需要显示的layer。
 (3)更新主屏幕参数:
  如果屏幕需要旋转,则需更新所有可见区域和共享控制块,并计算旋转参数;
  判断主屏幕是否需要被冻结;
  判断是否有新加入的layer;
  去除不再需要的layer,通过ditchedLayers.add(layer)释放资源;
 (4)通过广播更新所有改变。
4.4handlePageFlip函数
 该函数主统计所有layer的信息,针对需要的layer进行重绘,并计算屏幕实际可显示区域。
 (1)调用lockPageFlip(currentLayers)
 遍历currentLayers包含的所有layer,依次调用每层layer对应的lockPageFlip函数。首先通过retireAndLock函数取得新的frontbuffer,然后获取并计算脏的区域,最后调用reloadTexture函数更新这些区域。
 (2)如果有需要显示的layer,调用computeVisibleRegions函数计算经过混合后每个layer的显示区域。每一个layer拥有三片区域,分别为opaqueRegion、visibleRegion和coveredRegion,主屏幕则拥有aboveOpaqueLayers、aboveCoveredLayers。在遍历每一层layer时,要计算没个layer对应的区域,同时同步更新主屏幕的aboveOpaqueLayers和aboveCoveredLayers。
 (3)调用unlockPageFlip(currentLayers)
 遍历currentLayers包含的所有layer,依次调用每层layer对应的unlockPageFlip函数,完成layer到屏幕的坐标变换。
4.5handleRepaint函数
 handlePageFlip更新并计算每一个独立layer的显示区域,handleRepaint则负责将每一个layer经过计算的显示区域数据搬运至屏幕的显存中。
 (1)根据不同的屏幕类型,设定更新模式,有部分更新、缓存更新、矩形框交换和全屏更新。
 (2)调用composeSurfaces(mDirtyRegion)
 该函数将遍历每一层layer,调用layer对应的onDraw接口,将数据从layer的缓存搬运至屏幕的显存中。
4.6hw.compositionComplete函数
 该函数会调用到gralloc模块的fb_compositionComplete接口,是提供给屏幕的回调接口,目前并没有实现任何功能,根据采用屏幕的不同可能需要填充相应操作。
4.7unlockClients函数
 unlockClients函数将遍历每一层layer,调用finishPageFlip释放layer用于的共享控制块。
4.8postFramebuffer函数
 handleRepaint函数执行的搬运操作实际将显示数据搬运至屏幕的后缓冲中,postFramebuffer最终将调用到eglSwapBuffers(dpy,surface),交换屏幕的后缓冲和前缓冲,实现显示更新。
4.9另一条路线
 如果hw.canDraw返回错误或者屏幕此时被冻结,那么将无法进行数据更新,此时将都另外一条路线,直接调用unlockClients,并休眠16667微秒。如果显示出现问题,16667微秒将保证每秒最多执行60次threadLoop函数
SurfaceFlinger学习之一:概览 SurfaceFlinger 是 Android 系统中负责合成和显示屏幕内容的关键系统服务,它运行在一个专用的进程中 (system/bin/surfaceflinger)。它的主要职责是将不同应用程序的绘制内容(即窗口或表面)组合起来,通过硬件抽象层(HAL)发送到屏幕上。 阅读详情

相关推荐

SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

应用进程 ComposerService: 定义:frameworks\native\include\private\gui\ComposerService.h 实现:frameworks\native\libs\gui\SurfaceComposerClient.cpp 作用:通过Singleton,定义单例类,初始化时候调用connectLocked,获取SurfaceFlinger服务代理...

zhzhangnews的博客 7416

【Android】SurfaceFlinger五大定律

SurfaceFlinger是整个Android系统渲染的核心进程。所有应用的渲染逻辑最终都会来到SurfaceFlinger中进行处理,最终会把处理后的图像数据交给CPU或者GPU进行绘制。

天天的博客 5143

【计算机视觉学习03】全景图像拼接

文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程

一个正在努力学习的iter 7787

SurfaceFlinger简介

1. SurfaceFlinger背景知识         SurfaceFlinger 是一个独立的Service, 它接收所有Window的Surface作为输入,根据ZOrder, 透明度,大小,位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由HWComposer或OpenGL生成最终的显示Buffer, 然后显示到特定的显示设备上。 下面首先介绍下相关概念:

撒哈拉的绿洲 2万+

【SPI-NAND】Linux驱动移植实战:从规格书解析到内核适配

本文详细解析了SPI-NAND Flash的Linux驱动移植实战,从规格书关键参数提取到内核MTD子系统适配。内容涵盖存储结构解析、命令集映射、设备树配置及厂商驱动开发,特别强调ECC校验、坏块管理等NAND特性处理,并提供了性能优化与测试验证的实用技巧。

weixin_27076351的博客 351

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 359

Android显示系统SurfaceFlinger详解 超级干货

本文详细讲解了Android显示系统SurfaceFlinger,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

WolfKingzyh的博客 1万+

Android 13 系统定制:实现第三方Launcher预置与原生Launcher3的共存切换

本文详细介绍了在Android 13系统中实现第三方Launcher预置与原生Launcher3共存切换的技术方案。通过修改ResolverActivity逻辑、处理首次启动设置以及优化用户切换机制,开发者可以灵活定制默认Launcher,同时保留用户自由选择权。文章还提供了常见问题排查指南和性能优化建议,帮助提升双Launcher方案的稳定性和用户体验。

weixin_30275415的博客 126

Android 渲染机制——SurfaceFlinger

SurfaceFlinger Android 图形架构使用了生产者——消费者模型。Surface 表示缓冲队列中的生产方,图像流最常见的消耗方是 SurfaceFlinger,该系统服务接收来自于多个源的数据缓冲区,组合它们,并将它们发送给显示设备。 Android 应用程序为了能够将自己的 UI 绘制在系统的帧缓冲区上,它们就必须要与 SurfaceFlinger 服务进行通信。SurfaceFlinger 服务运行在 Android 系统的 System 进程中,它负责管理 Android 系统的帧缓

卜大爷的博客 3万+

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

surfaceflinger分析

Surfaceflinger分析1. Surfaceflinger介绍2. bufferqueue 原理3. surfaceflinger 关系图4. layer显示内存分配5. surfaceflinger Layer 1. Surfaceflinger介绍   surfaceflinger作用是接受多个来源的图形显示数据,将他们合成,然后发送到显示设备。比如打开应用,常见的有三层显示,顶部的statusbar底部或者侧面的导航栏以及应用的界面,每个层是单独更新和渲染,这些界面都是有surfaceflin

一只立志于养老婆的程序猿 2650

1、初探 Tiny Machine Learning

Tiny Machine Learning(TinyML)是机器学习与嵌入式系统的融合领域,致力于在资源受限的微控制器上运行AI模型。本文介绍了机器学习基础、TinyML的核心概念、应用领域(如智能家居、工业物联网、医疗保健)、面临的挑战(如资源限制、模型压缩、数据质量),以及从硬件准备到模型部署的实践步骤。通过利用训练与推理的资源不对称性,可在PC上训练模型并部署至低功耗设备进行实时推理,推动边缘智能的发展。

loss4bartender的博客 121

SurfaceFlinger原理(一):SurfaceFlinger的初始化

  SurfaceFlinger是Android的一个native进程,负责将图层进行合成,图层叠加起来就构成了我们看到的界面。合成的方式分为在线合成和离线合成。在线合成是指现在一块buffer画好所有的内容,然后直接交给linux图像驱动framebuffer显示出来;离线合成是指将一些图层的buffer直接递交HWComposer,HWComposer指的是能够处理图像数据并组合的现实硬件模...

kernel_my的博客 2064

在WSL2中配置代理(Windows)

通过按照上述步骤在WSL2中配置代理,我们可以轻松地在Windows子系统Linux中使用代理服务器访问互联网。请确保提供正确的代理服务器地址和端口号,并根据实际情况进行修改。在WSL2中使用代理是一个常见的需求,它允许我们在Windows子系统Linux中通过代理服务器访问互联网。本文将详细介绍如何在WSL2中配置代理,并提供相应的源代码示例。如果返回的IP地址与代理服务器所在地不同,说明代理正常工作。希望本文能对你有所帮助!如有其他问题,请随时向我提问。替换为实际的代理服务器地址和端口号。

FcUnity的博客 4355

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

GUI显示系统之SurfaceFlinger

转载自http://blog.youkuaiyun.com/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue, VSYNC generation, Render等内容。 后面的几篇博文中我将按照如下的顺序贴出各小节内容。 文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得

zirconsdu的专栏 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android 图形系统之七:SurfaceFlinger

SurfaceFlinger 是 Android 系统中一个极为关键的系统服务,处于图形显示架构的核心位置,主要负责将各个应用层提供的 Surface(代表可视化的界面元素)进行合成,并最终输出到屏幕显示,起到了承上启下的桥梁作用,衔接应用层与硬件显示层。

执剑人 8839

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android多媒体框架介绍(五)显示图形系统之SurfaceFlinger初步介绍

前面介绍了比较直观的framebuffer模块(负责把有一个内存地址ADDR的内容显示到屏上),hwc模块(叠加器,负责把surfaceFlinger送来的各种输入layer叠加到显存上),接下来开始介绍surfaceFLinger这个android显示相关最核心的系统服务。 文章目录一、SurfaceFlinger定义与概念Surface定义---供生产方与消耗方交换图形buf缓冲区SurfaceFlinger定义---统一管理surface的合成显示系统服务SurfaceFlinger基础规格Surfa

runafterhit的博客 8598

Android SurfaceFlinger

SurfaceFlinger是Android系统中的一个重要组件,它主要负责窗口管理与界面显示。具体来说,SurfaceFlinger作为系统的显示引擎,负责接收各应用程序发来的图像数据,并组合成一张完整的画面,并输出到显示屏上。SurfaceFlinger通过重绘整个屏幕或部分屏幕来更新UI界面。它还提供了多种硬件加速技术,如OpenGL ES、Vulkan等,使应用程序能够更快地渲染UI界面。SurfaceFlinger还支持窗口叠加、透明度、混合模式等特性,以支持复杂的多层UI界面。

liuning1985622的博客 3957

android surfaceflinger研究----显示系统, Surface机制, SurfaceFlinger loop

转载自http://blog.youkuaiyun.com/windskier/article/details/7030732     这周抽空研究了一下SurfaceFlinger,发现真正复杂的并不是SurfaceFlinger本身,而是android的display显示系统,网上关于这部分的介绍有不少,本不打算写的,但是发现还是记录一下研究代码的过程比较好,一是能够帮助自己理清思路,另一个原因就是以后

zirconsdu的专栏 4670

【Android 12】认识窗口

这里我按照自己的理解画了一下Android架构图,主要是对看下Framework这块:顶层是基于ApplicationFramework层的Apps层,ApplicationFramework是运行在App进程的Framework代码,如四大组件,各种Manager。在这一层,屏幕上的一块显示区域,典型代表是Activity,但是Activity毕竟是一个综合性比较强的概念,具体到内容显示这块还是由Window类负责,Window则是容纳View对象的容器。

ukynho的博客 1万+

Surface 与 SurfaceFlinger 流程分析

和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、SurfaceFlinger 启动过程二、Surface 创建过程三、Surface 显示过程一、SurfaceFlinger 启动过程SurfaceFlinger 启动过程:SurfaceFlinger 进程是由 init 进程创建的,运行在独立的 SurfaceFlinger 进程中。init 进程...

程序员Android 578

SurfaceFlinger源码摘要

Android中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService). View,AMS,WMS可以说是整个上层显示系统的三驾马车 在Android中,一个窗口用一个Surface描述。多个窗口(窗口不一定都是Activity),需要同时显示,我们就需要将多个窗口进行合并。 Surfaceflinger控制窗口的合成,将多个窗口合并成一个,再送到LCD。 Surfaceflinger是Native的服务. Surfaceflinger中怎

fdsafwagdagadg6576的专栏 1811

surfaceflinger原理讲解

概念 SurfaceFlinger是一个系统服务,如:audioflinger,audiopolicyservice等等,系统的主要服务通过这个文章进行了解,Android的系统服务一览。这个系统服务主要实现了Surface的建立、控制、管理等功能。换种说法就是,在Android的实现中它是一个service,提供系统范围内的surface composer(界面显示合成)功能,它能够将各种应用程序的2D、3D surface进行组合。 原理分析 让我们首先看一下下面的屏幕简略图: ...

qq_34738528的博客 1816

SurfaceFlinger模块

当mLayerClass被初始化成功之后,第三方应用可以通过binder调用,查询SurfaceFlinger进程这个应用的Layer是不是游戏的Layer。可以自定义cpuset,就是可以根据各自的需求,动态配置自定义的cpuset,例如SurfaceFlinger的线程默认跑到4个小核上,假如有个需求要把SurfaceFlinger的线程跑到大核上,就可以配置自定义cpuset,在进入某个场景的时候,把SurfaceFlinger进程pid配置到自定义的cpuset的tasks中。

m0_61097519的博客 1948

Android GUI系统之SurfaceFlinger(01)显示系统框架

本章节思维导图如上。主要讲述了显示系统的基础,了解FrameBuffer与Android的关系,给出SurfaceFlinger的整体框架以及一个核心的demo测试程序。接下来的章节 将以该demo为核心进行阐述和分析。1 frameBuffer与Android当我们的程序 想要 在屏幕上显示内容时,我们的机制是直接向FrameBuffer(后面简称FB)写入内容来实现。接下来谈谈Android 实用FB的策略:如果只有一个FB,当APP写入速度>LCD显示速度时没问题;

wangdsh的博客 5476
上一篇: Android SurfaceFlinger process 流程分析
下一篇: Android智能指针SP WP使用方法介绍
learnerz
博客等级 码龄16年 51粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值