windowManager学习笔记

这是小彤宝的老公的笔记!

window会有很多flag,flag能够进行设置,例如最下层,最上层

window实现是phonewindow,window在activity attach生命周期内回调新建,并且拿到window对象setWindowManager,通过context拿到systemService创建WindowManager

addView时创建ViewRootImpl

桥接模式,上层关联,下层做工作

window是View的容器

ActivityThread创建完window后进行oncreate分发,创建DecorView创建(具体见三大流程底层原理)

在resume时拿到ViewManager,将创建的DecorView和layoutManager添加进Window

window只是接口,windowManger只是代理,添加后WindowManagerGlobal 

WindowManagerGlobal 是单例模式,全进程只有一个管理View和LayoutParams

WindowManagerGlobal.addView()

View树树根是ViewRootImpl但是并非ViewGroup和View子类

创建时ViewRootImpl对应一个windowManagerImpl

ViewGroup和View组合模式

ViewRootImpl使用IWindowSession和WMS进行通信

ViewRootImpl是在WindowManagerGlobal.addView时创建出来,会保存一个对

sWindowSession(其实就是WMS) 是一个媒介对应WMS,在ViewRootImpl拿到时通过get给到ViewRootImpl,可以直接调用

连续setTextView重绘几次?

为什么60fps?

有一个(1000/60)16ms的指标,一般而言16ms绘制一次

UI两次setTextView至少需要等16ms才能绘制下一帧,所以连续两次只触发一次(存疑此处有可能更多,三大流程具备一定条件下反复绘制)

invalidateChild是等到信号回来后进行刷新吗?

WMS通过surface控制surfaceControl来控制surfaceFlinger 通过client

ViewRootImpl是Window和View的桥梁,主要作用的刷新UI重绘,ViewRootImpl会持有surfaceControl

在三大流程里忽视的细节

在三大 流程之前有可能三次重算Window大小,那么如何绘制的?

初始化的surface这个时候就会被传递给WMS进行绘制(当时看的时候细节忽视)

windowManager学习笔记_第1张图片

Android渲染机制

谁来准备?GPU

谁来真正绘制?CPU

通过信号来控制发送和渲染,使用Double Buffering来节约性能

但是Double Buffer会照成一个耗时,例如A时间过长B已经开始绘制就会卡顿

那么使用Triple Buffer优化,AB制作的空隙中预先绘制C

一个window对应3个buffer而不是一个App对应三个buffer

一个window对应Surface surface是一个图层

surfacefinger(一个surface处理)把window合成给到屏幕

suface对应生产者 ()队列() 消费者

硬件合成只是合成一张图片给到屏幕

软件合成是一个处理好的直接给到屏幕

什么是surferView surferView拥有一个surfer

你可能感兴趣的:(学习)