这是小彤宝的老公的笔记!
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进行绘制(当时看的时候细节忽视)
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