解码60FPS流畅渲染:Android图形子系统核心机制全链路剖析

Android---WMS核心分析 比如:告诉 WMS 某一个类型 Window 的 Z-Order的值是多少,帮助 WMS 矫正不合理的窗口属性,为 WMS 监听屏幕旋转的状态,预处理一些系统按键事件(例如HOMW、BACK 键等的默认行为就是在这里实现的)等。 阅读详情

点击上方“IT烂笔头”,选择“置顶公众号”

第一时间获取 IT 技术干货!

Android图形子系统核心机制全链路剖析

阅读文本大概需要 15 分钟。

①主要的类

DecorView、ViewRootImpl、Window、WMS、Surface、SurfaceFlinger、BufferQueue、FrameBuffer

1. DecorView

是 Android 视图系统里的关键组件,在 Activity 界面显示与布局管理方面扮演着重要角色。下面详细介绍其主要作用:

1.1 作为视图树的根节点

DecorView 是每个 Activity 视图树的顶级视图,继承自 FrameLayout。当 Activity 启动时,系统会创建一个 Window 对象(通常是 PhoneWindow),并为其关联一个 DecorView。所有添加到 Activity 中的视图,最终都会被添加到 DecorView 之下,形成一个完整的视图树。示例如下:

DecorView
├─ 状态栏区域
├─ 标题栏区域(可选)
└─ ContentParent(id 为 android.R.id.content)
   └─ 用户自定义布局
      ├─ 子视图 1
      ├─ 子视图 2
      └─ ...
      
    1.2 承载系统界面元素

DcorView 会包含一些系统级的界面元素,像状态栏、标题栏(在启用的情况下)。这些元素由系统统一管理,且通常位于用户自定义布局的上方。借助 DecorView,系统能够统一管理这些公共界面元素的显示与交互。

1.3 关联 Window 和视图树

DecorView是Window和视图树之间的桥梁。Window代表屏幕上的一个显示区域,而DecorView则是这个区域内视图的容器。Window的属性(如背景、透明度等)会影响DecorView的显示效果,DecorView也会将用户的交互事件传递给Window进行处理。

1.4 处理输入事件分发

DecorView是输入事件进入视图树的入口。当用户触摸屏幕、按下按键等操作发生时,系统会将事件传递给DecorView,然后由DecorView将事件分发给其下的子视图。在事件分发过程中,DecorView会根据视图的层级和位置,决定哪个子视图应该接收和处理该事件。

1.5 配合 ViewRootImpl 工作

DecorView 与 ViewRootImpl 紧密协作。ViewRootImpl 负责管理视图的测量、布局和绘制过程,而 DecorView 作为视图树的根节点,会接收 ViewRootImpl 发起的这些操作请求,并将其递归传递给子视图。例如,ViewRootImpl 调用 DecorView 的 measure 方法,DecorView 会依次调用子视图的 measure 方法,从而完成整个视图树的测量。

小结

DecorView 作为 Activity 视图树的根节点,不仅承载系统界面元素,还关联 Window 和视图树,负责输入事件分发,并且与 ViewRootImpl 配合完成视图的测量、布局和绘制工作,在 Android 界面显示和交互中起着关键作用。

2. ViewRootImpl

是 Android 视图系统里的核心类,在视图的渲染、事件处理和窗口管理等方面起着关键作用。下面详细介绍其主要作用:

2.1 连接视图树和窗口系统

ViewRootImpl 是视图树和 WindowManagerService(WMS)之间的桥梁。每个 Activity 里的视图树都有一个对应的 ViewRootImpl 实例,它负责与 WMS 进行通信,将视图的状态和请求传递给系统窗口管理服务。

2.2 视图的测量、布局和绘制

测量(Measure):ViewRootImpl 会触发视图树的测量过程,调用 View 的 measure 方法,确定每个 View 的尺寸。通过递归调用子 View 的 measure 方法,最终确定整个视图树的大小。

布局(Layout):在测量完成后,ViewRootImpl 会调用 View 的 layout 方法,为每个 View 分配在父容器中的位置。同样通过递归调用子 View 的 layout 方法,完成整个视图树的布局。

绘制(Draw):布局完成后,ViewRootImpl 会触发视图树的绘制过程,调用 View 的 draw 方法,将视图绘制到 Surface 上。

2.3 处理输入事件

ViewRootImpl 负责接收来自系统的输入事件(如触摸、按键等),并将这些事件分发给视图树中的相应 View。它会根据事件的坐标和视图的位置,确定哪个 View 应该处理该事件,然后调用相应 View 的事件处理方法。

2.4 管理视图的生命周期

ViewRootImpl 会监听窗口的状态变化,如窗口的显示、隐藏、大小改变等,并根据这些变化触发视图树的重新测量、布局和绘制。例如,当窗口大小改变时,ViewRootImpl 会重新测量和布局视图树,以适应新的窗口尺寸。

2.5 同步 UI 线程和渲染线程

ViewRootImpl 会确保 UI 线程的操作与渲染线程的同步。在 Android 中,UI 操作必须在主线程进行,而渲染操作可能在单独的线程中进行。ViewRootImpl 会协调这两个线程的操作,避免出现渲染冲突和界面闪烁的问题。

ViewRootImpl 是 Android 视图系统的核心组件,负责连接视图树和窗口系统,处理视图的测量、布局、绘制和输入事件,管理视图的生命周期,以及同步 UI 线程和渲染线程。它确保了视图能够正确显示和响应用户操作。

3. Window 

指的是PhoneWindow,每一个ViewRootImpl都对应了一个Window,ViewRootImpl其实就是负责处理视图本身的一些逻辑事务(绘制,事件等管理)。而Window的作用主要是处理不同层级window之间的关系,便于WMS进行层级管理的一个抽象概念。Window主要有几大类:

    • 应用窗口:Activity
    • 子窗口:Dialog
    • 系统窗口:状态栏/导航栏/悬浮窗/Toast

4. WMS

是SystemServer进程的一个服务,主要负责管理各层级Window的关系,以及分配Surface用于绘制画面。

5. Surface

提供画图的API以及画布进行渲染,一个Window对应一个Surface,除了SurfaceView有自己独立的Surface。根据是否开启硬件加速,调用GPU或者CPU进行渲染,将View树转换成一帧画面GraphicBuffer入到BufferQueue当中:

    1. 提供绘图接口
    • Canvas API:通过 lockCanvas() 获取 Canvas 对象,支持 2D 图形绘制(如线条、文字)。
    • OpenGL ES:通过 EGLSurface 支持 3D 渲染,适用于游戏、视频等高性能场景。
    1. 缓冲机制(双缓冲/三缓冲)
    • Surface 内部维护多个 GraphicBuffer(通常为 2-3 个),通过交替使用避免绘制过程中的画面撕裂。
      • Front Buffer:当前显示在屏幕的缓冲区。
      • Back Buffer:供应用绘制的缓冲区,完成后通过 unlockCanvasAndPost() 提交,替换为新的 Front Buffer。
    1. 生产者-消费者模型
    • 生产者:应用通过 Surface 绘制内容(填充缓冲区)。
    • 消费者:SurfaceFlinger 消费缓冲区数据,合成最终帧并送

6. SurfaceFlinger

主要是当vsync-sf信号到来时,获取BufferQueue中的GraphicBuffer与各层中的画面根据z-order /大小/位置/透明度等信息进行合并操作

7. BufferQueue

用来管理Surface与SurfaceFlingger之间数据GraphicBuffer)的容器,三重缓冲说的就是BufferQueue里面有三个缓冲区对应三个缓冲的帧

8. FrameBuffer

这个是SurfaceFlinger将合成好待显示的帧缓存的地方

②显示系统各类协作流程

1、从启动到监听VSync信号:

ActivityThread执行performLaunchActivity()方法,然后performLaunchActivity方法里调用Activity.attach()方法,attach方法里会调用实例化PhoneWindow对象,然后performLaunchActivity方法里调用Instrumentation类的callActivityOnCreate()方法,callActivityOnCreate会调用Activity类的performCreate()方法,performCreate方法调用Activity的onCreate()方法,onCreate方法中调用setContentView()方法,setContentView方法里调用PhoneWindow的setContentView()方法,PhoneWindow的setContentVIew里面实例化DecorView,PhoneWindow在继续调用LayoutInflator.inflate方法将布局解析到Decorview的视图树中。然后AMS调用ActivityThread的handleResumeActivity()方法,这个方法里面主要做两件事,第一步调用Activity的onResume()方法,然后调用WindowManager.addView(),addView方法最后是调到WindowManagerImpl的addView()再调用到WindowManagerGlobal.addView(),这个方法里面实例化ViewRootImpl并将DecorView通过ViewRootImpl.setView()传递过来,setView方法里面调用自身的requestLayout(),然后方法里调用scheduleTraversals()去Handler里放一个同步屏障,并通过Choreographer去监听VSync信号。

1.1 创建Activity实例,初始化窗口体系
1.2 视图的创建
1.3 Activity的resume阶段
1.4 注册VSync信号
2、VSync信号驱动画面绘制

当系统发出一个VSync信号时,Choreographer的内部类FrameDisplayReceiver的onVsync收到回调,然后通过Choreographer的内部类FrameHandler切换到注册时所在的线程处理doframe(),通过注册的ViewRooImpl的内部类TraversalRunnable回调其中的run方法,再调用ViewRootImpl中的doTraversal(),再调到performTraversals(),这个方法主要第一先调用relayoutWindow()来向WMS申请Surface,然后继续执行ViewRootImpl中的performMeasure()、performLayout()、performDraw()进行绘制,最终执行View的onMessure()、onLayout()、onDraw()方法(这里就是常说的渲染阶段,如果开启硬件加速,那么渲染就会交给GPU去处理)。

3、SurfaceFlinger执行合并送显操作

这个部分主要分成两个阶段,第一个阶段当应用APP中有一帧绘制完了之后,SurfaceFlinger如何知道开始进行合成?第二个阶段是当SurfaceFlinger收到合成的指令后,如何执行合成的步骤(合成五部曲)?

3.1 如何通知SurfaceFlinger有待合成的GraphicBuffer?

3.1.1 Buffer提交与通知

      • queueBuffer:应用绘制完成后,通过IGraphicBufferProducer::queueBuffer将GraphicBuffer放入BufferQueue队列,状态变为QUEUED;
      • onFrameAvailable:BufferQueue通过FrameAvailableListener跨进程通知SurfaceFlinger有新帧待合成(Binder调用SurfaceFlinger::onFrameAvailable)

3.1.2 合成准备

      • handleMessageInvalidate:SF在消息循环中监听INVALIDATE事件,调用latchBuffers()锁定新Buffer
      • acquireBuffer:从BufferQueue中获取QUEUED状态的Buffer,标记为ACQUIRED(此时应用不可修改该Buffer)

3.1.3 VSync同步与触发

      • onVSyncReceived:硬件VSync信号通过DisplayEventReceiver触发,调用invalidate()插入刷新消息
      • handleMessageRefresh:处理Refresh消息,启动合成管线
3.2 执行合成(5部曲)
class SurfaceFlinger {

    //合成五部曲
    void SurfaceFlinger::handleMessageRefresh(){
        //合成之前的预处理,检查是否有新的图层变化,如果有,执行请求下一次VSync信号
        preComposition();
        //若Layer的位置/先后顺序/可见性发生变化,重新计算Layer的目标合成区域和先后顺序
        rebuildLayerStacks();
        //调用hwc的prepare方法询问每个图层是否支持硬件合成
        setUpHWComposer();
        //当打开开发者选项中的“显示Surface刷新”时,额外为产生变化的图层绘制闪烁动画
        doDebugFlashRegions();
        //如果不支持硬件合成,在该方法中会调用GPU合成,接着提交buffer
        doComposition();
        //调Layer的onPostComposition方法,主要用于调试,可以忽略
        postComposition(refreshStartTime);
    }
}

3.2.1 图层预处理(preComposition)

核心任务:标记所有待合成的图层(Layer),通知各图层即将        进入合成阶段。

关键操作:

      • 调用各图层的onPreCompisition()方法,更新其状态(如可见性、脏区域标记)
      • 检查是否有图层内容变化

技术细节:若图层无新帧(Buffer未更新),则跳过后续合成,减少冗余计算

代码:

class SurfaceFlinger {

    void SurfaceFlinger::preComposition(){
        bool needExtraInvalidate = false;
        const LayerVector& layers(mDrawingState.layersSortedByZ);
        const size_t count = layers.size();
        for (size_t i=0 ; i<count ; i++) {
            //因为在调用合成之前已经计算过脏区域,如果有图层在计算以后加入了队列,那么在预处理阶段要再次请求VSync信号
            if (layers[i]->onPreComposition()) {
                needExtraInvalidate = true;
            }
        }
        //存在未处理的layer,执行请求下一次VSync信号,避免这段时间内的帧数据丢掉了
        if (needExtraInvalidate) {
            signalLayerUpdate();
        }
    }

}

3.2.2 图层堆栈重建(rebuildLayerStacks)

核心任务:根据窗口层级(Z-order)和可见区域,重新计算图  层的叠加顺序与裁剪区域。

关键操作:

      • 层级排序:按窗口管理器(WindowManager)提供的Z轴顺序排序图层

      • 可见性计算:动态裁剪重叠区域;是被脏区域,仅更新内容变化的区域

代码:

class SurfaceFlinger {

    void SurfaceFlinger::rebuildLayerStacks(){
        //获取当前应用程序所有按照z-order排列的layer
        const LayerVector& layers(mDrawingState.layersSortedByZ);
        //遍历每一个显示屏
        for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
            //z-order排列的layer
            hw->setVisibleLayersSortedByZ(layersSortedByZ);
            //显示屏大小
            hw->undefinedRegion.set(bounds);
            //减去不透明区域
            hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
            //累加脏区域
            hw->dirtyRegion.orSelf(dirtyRegion);
        }
    }

}

3.2.3 硬件合成器准备(setUpHWComposer)

核心任务:配置硬件合成器(HWC),决策各图层的合成策略 (硬件/GPU合成)。

关键操作:

      • HWComposer协商:通过HWC的Prepare方法提交所有的图层信息(格式、位置、透明度);HWC根据硬件能力(Overlay层数限制)标记可硬件合成的图层(HWC2::Composition::Device),剩余标记为GPU合成(HWC2::Composition::Client)

      • 若硬件不支持特定格式(如DRM保护内容),强制回退到GPU合成

性能优化:优先使用HWC合成(如视频播放层),降低GPU负 载

代码:

class SurfaceFlinger {

    void SurfaceFlinger::setUpHWComposer() {
        //prepareFrame方法中调用了HWComposer::prepare方法
          //在HWC的prepare方法中,将会确定每一个图层使用哪种合成方式
        for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
            auto& displayDevice = mDisplays[displayId];
            if (!displayDevice->isDisplayOn()) {
                continue;
            }
            status_t result = displayDevice->prepareFrame(*mHwc);
        }
    }
}

3.2.4 执行合成(doComposition)

核心任务:按合成策略执行实际合成操作,生成最终帧。

关键操作:

      • GPU合成
        • 通过RenderEngine(基于OpenGL ES/Vulkan)渲染复杂图层(如旋转、缩放特效)

        • 将DPU无法合成的图层(如HWC标记为Client的图层)合并到临时缓冲区

      • HWC合成
        • 直接传递可硬件合成的图层给HWC(避免GPU内存拷贝)

        • HWC调用显示处理器(DPU)执行混合计算(如Alpha混合、Overlay叠加)

      • 混合输出
        • GPU合成的结果与HWC处理的图层最终合并为单一帧(Framebuffer)

代码:

class SurfaceFlinger {

    void SurfaceFlinger::doComposition(){
        //遍历所有的DisplayDevice然后调用doDisplayComposition函数
        for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
            const sp<DisplayDevice>& hw(mDisplays[dpy]);
            if (hw->isDisplayOn()) {
                //获得屏幕的脏区域,将脏区转换为该屏幕的座标空间
                const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
                //在此方法中将会调用到doComposeSurfaces()方法
                //在doComposeSurfaces方法中,将会为被标记为不支持硬件合成的图层调用Layer#draw()方法使用OpenGL ES合成
                doDisplayComposition(hw, dirtyRegion);
            }
        }
        postFramebuffer();
    }
}

3.2.5 合成后处理(postComposition)

核心任务:提交帧到显示设备,释放资源并同步状态

关键操作:

      • 帧提交:

        调用Output::present()将最终帧通过Gralloc缓冲区传递到显示控制器(Display Controller)

      • 缓冲区释放
        • 通知应用层释放已使用的GraphicBuffer(通过BufferQueue::releaseBuffer)

        • 检查缓冲区泄漏(如dumpsys SurfaceFlinger | grep "BufferQueue")

      • VSync同步:

        等待下一个VSync信号提交帧,避免撕裂(Tearing)

4、小结

Android 图形子系统涉及较多细节且流程较为复杂。概括来说,其核心流程主要包含以下环节:首先通过 DecorView 创建并容纳布局内容,随后由 ViewRootImpl 统一管理 View 内的事件处理(包括触发的绘制操作)。Window 作为抽象对象,定义了不同图层间的逻辑关系。每个 Window 关联一个 Surface,该 Surface 负责实际绘制画面内容。系统通过 BufferQueue 构建了一个 GraphicBuffer 的生产者-消费者模型,连接 Surface(生产者)与 SurfaceFlinger(消费者)。SurfaceFlinger 则负责协调与管理不同图层的合成工作。最终,合成后的帧图像被输出到显示器进行呈现。

扫码关注我

一起感悟技术魅力

点分享

点收藏

点点赞

点在看

Android图形系统(三)系统篇:渲染/合成的底层原理浅析 众所周知,渲染工作是由GPU负责,那么在聊GPU之前首先得知道什么是“渲染”?我们来举个例子感受一下在系统中申请一块10*101、把图层背景这玩意染成绿的2、从左上(0,0)到右下(10,10)画一条宽度为1颜色为红色的直线3、以坐标点(5,5)为中心,画一个半径为3的实心圆,颜色要蓝色好了,接下来操作系统会把这些“绘图指令”同步给GPU去执行渲染任务图片来源:自己画的GPU完成渲染工作后,我们将会得到一个大小为10*10二维数组,数组中的每个元素都保存着坐标点的颜色信息、深度信息。 阅读详情

相关推荐

Android显示系统(09)- SurfaceFlinger的使用

之前文章讲解了Android显示系统的架构,并且花了大量时间介绍了OpenGL ES,以及为了保证OpenGL ES的平台无关性,Android引入的EGL。不过我们都是借助于来学习的,而我们构建对象的时候,在Native层做了很多的事情,其中,大多数逻辑都是辅助我们完成的,它才是整个Android显示系统的核心。最重要的职责就是合成各个App传递过来的Surface。本文先学会在Native层使用,后续根据代码一点点引入不同知识。**说明:**后续文章如果出现SF那就是我对的缩写。

Ziwubiancheng的博客 2350

android display 笔记(八)WMS与SurfaceFlinger交互

在Android系统中由WindowManagerService也就是WMS承担窗口位置的管理。

镇元子的博客 1044

android surfaceflinger研究----Surface机制

前一篇文章介绍了android的显示系统,这篇文章中,我们把视角往上层移动一下,研究一下framework是如何与surfaceflinger进行业务交互的。如何创建surface,如何显示窗口等等,所有的这一切都是通过系统服务WindowManagerService与surfaceflinger来进行的。     android中的Surface机制这一块代码写的比较难理解,光叫Surface

杜文涛的专栏 3万+

Android 图形系统(Graphics)

系统绘制的是什么?图形缓冲区,也叫Buffer。应用层的View树最终会转换成Buffer,置于BufferQueue中被绘制。绘制的位置在哪里?应用端会把一切内容渲染到surface上,最终显示到LCD/OLED显示屏如何把图像绘制到屏幕?绘制任务由应用发起,通过跨进程方式把Buffer传到FW层,由FW层中的SurfaceFlinger服务调用Linux 硬件驱动最终绘制到硬件屏幕上。

cmyperson的博客 2195

Android WMS—— Surace管理 (二十一)

WMS 负责创建 Surface 以及对 Surface 的摆放工作,之后将 Surface 提交给SurfaceFlinger 进行合并。在 App 层也创建了一个 Surface 对象,但是那个是空对象,用于 WMS 的填充。

小旭的专栏 942

Unity UGUI高斯模糊背景效果 简易解决方案

UnityUI背景模糊效果简易解决方案1.功能描述简易界面框架搭建合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 1.功能描述 在我们玩游戏的时候,经常会看到一些游戏会对UI做这样的处理: 可以看到,新开的上层UI界面会以下层UI界面的模糊

SaberZG的博客 1万+

安卓图形显示系统

图中的SurfaceFlinger是Android系统中的一个重要服务,它的主要作用是将多个来源的图形显示数据合成,然后发送到显示设备。比如打开应用,常见的有三层显示,顶部的statusbar底部或者侧面的导航栏以及应用的界面,每个层是单独更新和渲染,这些界面都是有surfaceflinger合成一个framebuffer刷新到display硬件中显示。底层为系统级别的显示,解决如何将绘制好的图层送显的问题,主要为。上层为应用级别的显示,解决如何绘制图层的问题,主要为。

sunny 1418

3DGS-to-PC实战指南:零代码实现3D高斯场景到点云/Mesh的高效转换

本文详细介绍了3DGS-to-PC工具如何实现3D高斯场景到点云/Mesh的高效转换,无需代码即可完成。通过实战案例和参数调优技巧,帮助用户快速掌握这一开源插件的使用方法,提升3D数据处理效率。特别适合建筑扫描、影视特效等领域的专业人士。

q1w3e5r7t9y的博客 273

Android图形子系统详解

Android的图形系统发展经历了通过CPU模拟图形操作,和GPU专门进行图形处理的阶段,因为这方面硬件技术发展很快,因此Android图形系统也在不断调整,以期提供更加快速流畅的UI体验。 图形操作可以有两种方式实现:一是利用通用CPU模拟图形操作;二是利用GPU专门做图形操作。前者会增加CPU的负担,在现在高分辨率已经是普遍现象的时候,让通用处理器来完成大量的图形计算已经不现实。An

sunnytina的专栏 2514

告别卡顿!手把手教你用北鲲云超算平台图形化提交COMSOL仿真任务(附RDP连接技巧)

本文详细介绍了如何利用北鲲云超算平台图形化提交COMSOL仿真任务,解决本地计算资源不足导致的卡顿问题。通过云端高性能计算,用户可轻松配置多核CPU和大内存资源,实现高效仿真计算,并附有RDP连接优化技巧,提升远程操作体验。

weixin_42519781的博客 378

三相电机控制中的端电压、相电压与线电压波形解析

本文深入解析了三相电机控制中端电压、相电压与线电压的核心概念与波形差异。通过对比方波控制、SPWM和SVPWM三种主流控制策略下的实测波形特征,揭示了不同控制逻辑对电压波形(如梯形波、正弦波、马鞍波)的影响。文章重点阐述了SVPWM控制如何通过生成马鞍波形端电压来提高直流母线电压利用率,并提供了实用的波形测量与调试指南,帮助工程师深入理解电机控制原理并进行有效调试。

qsc901234567的博客 1393

<span class=“js_title_inner“>解码60FPS流畅渲染:Android图形子系统核心机制全链路剖析</span>

测量(Measure):ViewRootImpl 会触发视图树的测量过程,调用 View 的 measure 方法,确定每个 View 的尺寸。ViewRootImpl 是 Android 视图系统的核心组件,负责连接视图树和窗口系统,处理视图的测量、布局、绘制和输入事件,管理视图的生命周期,以及同步 UI 线程和渲染线程。绘制(Draw):布局完成后,ViewRootImpl 会触发视图树的绘制过程,调用 View 的 draw 方法,将视图绘制到 Surface 上。

吴延宝 650

BurpSuite实战:5分钟搞定Pikachu靶场表单爆破(附最新字典配置技巧)

本文通过Pikachu靶场实战,详细演示了如何使用BurpSuite的Intruder模块对Web登录表单进行暴力破解。从代理配置、请求捕获、集束炸弹模式设置,到载荷配置与结果分析,提供了完整的操作流程。文中还分享了2024年有效的字典获取与优化技巧,帮助安全测试人员快速定位弱口令漏洞。

weixin_29327977的博客 598

揭秘:60FPS流畅体验背后,Android渲染机制深度解析与性能优化秘籍!

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点Android 的渲染显示是一个复杂的过程,涉及多个系统组件和层次。为了理解帧率、掉帧和卡顿的原理,我们需要深入了解 Android 的渲染体系。

AntDream的程序世界 715

(一)企业微信 - 会话内容存档

企业微信获取会话记录。

专打丶小豆豆的博客 2887

【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】

在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用的可用性。本文将详细分析此问题的原因及其解决方案。

颜淡慕潇 8737

Android SurfaceFlinger

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

liuning1985622的博客 3957

【WRF数据准备】基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

WW、forever的博客 589

Android Framework(四)WMS-窗口显示流程——窗口创建与添加

2、在Activity的onResume阶段,执行 addView ,而这个 addView 后的逻辑才是触发 Window 显示流程,所以执行了 onResume 只是 Activity 可见,不代表 View 都显示了,这个时候都没触发 WMS 的绘制,如果后续的流程中出了问题,我们写在 XML 里的布局是不会显示在屏幕上的。Input 事件的传递流程都是先走到 Window,因为在 WMS 模块没有 Activity 的概念,只有 Window ,那么最后是怎么走到 Activity 呢?

芸兮的博客 2983

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

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

lwip-2.0.3

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

Android P 图形显示系统(九) Android图形显示子系统概述

文章目录图形系统显示系统Buffer管理显示系统的架构从应用的角度理解Android Android图形显示子系统概述 Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示系统的手机是什么样子,可能连对讲机都不如吧。图形显示系统比较复杂,从Android诞生到现在,几经修改,已经变的越来越庞大了。总的说来,图形显示系统可以分为两大部分...

夕月风 9826

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

surfaceflinger

这篇文章中,我们把视角往上层移动一下,研究一下framework是如何与surfaceflinger进行业务交互的。如何创建surface,如何显示窗口等等,所有的这一切都是通过系统服务WindowManagerService与surfaceflinger来进行的。       android中的Surface机制这一块代码写的比较难理解,光叫Surface的类就有3个,因此本篇文章从两部分来

q哥岁月的专栏 1521

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android图形系统框架解析

本文简要介绍了Android图形系统架构,重点解析了Surface的核心作用。Surface作为图形队列连接生产方(如播放器、OpenGL)和消费方(如SurfaceFlinger),支持图像数据的传递和处理。文章通过示意图展示了生产者-消费者模型,以及生产者叠加的处理流程,并提到Native Framework中Surface的实现细节。作者表示后续将深入分析SurfaceView、解码器等具体组件,同时指出需要结合实践才能更好理解官方文档的深层含义。

白嫩豆腐 519

图解Android - Android GUI 系统 (1) - 概论

Android的GUI系统是Android最重要也最复杂的系统之一。它包括以下部分: 窗口和图形系统 - Window and View Manager System. 显示合成系统 - Surface Flinger 用户输入系统 - InputManager System 应用框架系统 - Activity Manager System. 它们之间的关系如下图所示 只有对这些系统的功能和工作...

极客神殿 790

SurfaceFlinger和端侧的大体框架(2)

这篇博客会带大家探究app和WMS是怎么通过binder和SurfaceFlinger进行通信,主要围绕如何基于Binder去创建一个Surface来展开。Binder是一个Android用于跨进程通信的方案,在Android中使用非常多,后面会专门写一个关于Binder专题,在阅读这篇文章之前,只要知道java和c++分别是怎么使用binder的就可以了。

起司锅仔的博客 2317

转 Android Graphics 图像显示系统 - 开篇

该系列文章聚焦Graphics知识,从基本概念和简单的Demo入手,分析图形显示基本框架和运作流程。涉及内容众多,比如SurfaceFlinger的运行机制,VSYNC信号的产生与分发,BufferQueue的工作原理,Mapper&Allocator,Fence同步机制 ....比如生产者消费者模型比如BufferQueue的工作机制比如图形显示合成的基本流程DRM HWC 合成的基本工作流程Android多屏显示的基本知识-同显、异显、多屏互动作为学习记录,后续会分主题分别介绍。

TyearLin的专栏 218

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

这个流程触发的地方非常多,只是当前 finishDrawingWindow 会主动触发一次罢了。这一部分的逻辑有点绕,不过目前分析的是主流程,所以这块逻辑以上的描述当黑盒理解这段的调用: View 绘制结束后就会在 4.2 出触发 4.1 内部的执行,进入触发 finishDrawingWindow 流程即可。这一步执行完后,应用端就可以开始绘制 View 树了,绘制完成后,需要把内容显示到屏幕上,也就是现在这个 Surface ,这一步就是本篇分析的内容:finishDrawingWindow 流程。

芸兮的博客 3673
上一篇: Unable to select a master clock domain because no path can be found from “SYSTRACE“ to “LINUX_FTRACE
下一篇: <span class=“js_title_inner“>解码60FPS流畅渲染:Android图形子系统核心机制全链路剖析</span>
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值