GUI系统总结

来源:互联网 发布:java中怎么求绝对值 编辑:程序博客网 时间:2024/05/22 03:04
GUI系统之SurfaceFlinger
一、整体架构
1. Linux内核提供了framebuffer的显示驱动,fb0表示第一个显示屏;
2. Android的HAL层提供了Gralloc,包括fb和gralloc两个设备。前者负责打开内核中的framebuffer、初始化配置、并提供了post,setSwapInterval等操作接口;后者则管理帧缓冲区的分配和释放;
3. HAL层的另一个重要模块是“Composer”,它的直接使用者是SurfaceFlinger中的HWComposer,它出了管理Composer的HAL模块外,还负责VSync信号的产生和控制;


二、Gralloc和FramebufferNativeWindow
1. FramebufferNativeWindow继承了ANativeWindow,提供了setSwapInterval,dequeueBuffer和queueBuffer等函数;
1. Gralloc的加载是在FramebufferNativeWindow的构造函数中;
2. FramebufferNativeWindow申请的缓冲区保存在buffers数组中,每个元素是一个NativeBuffer,它继承了ANativeWindosBuffer;
3. dequeueBuffer方法是FramebufferNativeWindow的核心,主要是从buffers数组中找到一个空闲的缓冲区,返回给客户端(生产者)使用;


三、应用程序端的本地窗口Surface
1. Surface和FramebufferNativeWindow一样,也继承了ANativeWindow;
2. Surface是面向Android系统中所有UI应用程序的,即它承担着应用进程中的UI显示需求;
3. 通过mGraphicBufferProducer来获取GraphicBuffer,而这些缓冲区会被记录在mSlots数组中;
4. ViewRootImpl持有一个Java层的空Surface对象mSurface,之后ViewRootImpl向WMS发起relayout请求,WMS会让WindowStateAnimator生成一个SurfaceControl,通过Surface的copyFrom函数,复制到mSurface中;
5. ISurfaceComposer是SF的实名Binder,调用它的createConnection得到ISurfaceComposerClient,ISurfaceComposerClient的对象命名为mClient,调用它的createSurface函数的到IGraphicBufferProducer对象,再由IGraphicBufferProducer创建出SurfaceControl;
6. IGraphicBufferProducer提供了requestBuffer、dequeueBuffer和queueBuffer等操作;
7. FramebufferNativeWindow是专门为SF服务的,它由Gralloc提供支持;Surface是为应用程序服务的,由SF统一管理的;
8. 为应用程序服务的本地窗口Surface,它依赖的IGraphicBufferProducer在Server端的实现是BufferQueue;


四、BufferQueue
1. BufferQueue重载了queueBuffer,requestBuffer,dequeueBuffer等,还有mSlots数组,保存着BufferSlot对象;
2. BufferSlot对象包含了GraphicBuffer和BufferState,State的周期是FREE->DEQUEUED->QUEUED->ACQUIRED->FREE;
3. 当应用程序即Producer需要使用一块Buffer时,就会向BufferQueue发起dequeue申请,操作完成后再调用queue接口;SF即消费者在收到BufferQueue的onFrameAvailable回调后,就会调用acquire获取buffer;
4. 当mGraphicBufferProducer的dequeueBuffer得到mSlots中可用的数组成员序号buf后,因为客户端和BufferQueue运行在不同的进程中,所以双方的mSlots[buf]不是指向同一块物理内存,所以需要调用requestBuffer,复制服务器端的mSlots[buf].GraphicBuffer到客户端(因为GraphicBuffe实现了Flattenable接口,通过ashmem共享内存);
5. 服务器端的GraphicBuffer是在BufferQueue的dequeueBuffer的最后,调用mGraphicBufferAlloc的createGraphicBuffer函数分配的;


五、开机启动动画BootAnimation
1. BootAnimation继承了Thread,在它的构造函数中创建了SurfaceComposerClient的对象mSession;SurfaceComposerClient是UI应用程序与SF间的纽带,不过SurfaceComposerClient只是一个壳,真正起作用的是其内部的ISurfaceComposerClient,通过它获得IGraphicBufferProducer;ISurfaceComposerClient代表SF,IGraphicBufferProducer代表BufferQueue;
2. 在BootAnimation的readyToRun函数中,调用mSession的createSurface创建SurfaceControl对象,内含Surface,又内含了IGraphicBufferProducer,在SF的Client类的createSurface中,通过消息调到SF的createLayer,生成了IGraphicBufferProducer对象gbp和Layer对象;
3. Layer对象是SF中的层,最终物理屏幕上的显示结果就是通过对系统中同时存在的所有画面进行处理而得到的;
4. 当EGL想通过Surface这个Native Window完成某些功能时,后者实际上又利用了ISurface和IGraphicBufferProducer来取得远程服务端的对应服务,已完成EGL请求;
5. 详见P262的时序图《深入理解Android内核设计思想》


六、应用程序与BufferQueue的关系
1. 应用程序通过ISurfaceComposerClient::createSurface()发起创建Surface的请求时,SF会创建一个Layer,并返回Handle和IGraphicBufferProducer
2. 应用程序可以通过createSurface来建立多个Layer,它们是一对多的关系,为应用程序申请的Layer,一方面需要告知SF,另一方面记录到各Client内部中;
3. 对于SF,它需要对系统中当前所有的Layer进行ZOrder排序,对于Client则利用内部的mLayers来逐一纪录新增的attachLayer和移除detachLayer的Layer;
4. 每个Layer对应一个BufferQueue,一个应用程序对应多个BufferQueue;


七、SurfaceFlinger
1. 一旦VSync信号出现,CPU立刻开始执行Buffer的准备工作;
2. 如果CPU+GPU的执行时间超过了1/60秒,但是CPU的执行时间小于1/60秒,那么在VSync信号到来时,CPU可以接着处理下一个缓冲区,而GPU继续处理前一个缓冲区,此时屏幕上显示的是第三个缓冲区的内容;
3. 应用程序的ISurfaceComposerClient对应的服务端类为Client,主要提供createSurface和destroySurface两个方法,Surface在服务器端对应的是Layer;
4. 同一个Activity中的UI布局共用系统分配的Surface进行绘图,但像SurfaceView这种UI组件却是特例,它独占一个Surface进行绘制;
5. Client只是SF分派给应用程序的一个代表,真正的图形层Layer需要另外申请,即调用Client提供的createSurface;
6. Client受到客户端的请求后,把请求消息放到SF的队列中,在SF执行过程中,Client所在的Binder线程会wait,直到SF完成后才被唤醒然后返回结果给客户端;


八、VSync信号的产生和分发
1. 硬件源:HWComposer
2. 软件源:VSyncThread模拟
3. SF内部的EventQueue监听VSync消息,需要刷新UI的各进程也需要监听;
4. VSync最终会被EventThread::threadLoop分发给各监听者,如SF中就是MessageQueue;




九、VSync信号的处理
1. handleMessageTransaction()
2. handleMessageInvaliate()
3. signalRefresh(): preComposition, rebuildLayerStacks, setUpHWComposer, doDebugFlashRegions, doComposition, postComposition




GUI系统之WMS
一、概述
1. 从用户角度讲,窗口是一个界面,从SF角度讲是一个Layer,承载着和界面相关的数据和属性,从WMS的角度讲是一个WindowState;
2. 当IMS收到一个按键或者触摸消息时,它需要寻找一个合适的窗口来处理,WMS正是窗口管理者;
3. 主要包含功能:窗口的添加与删除,起过度作用的启动窗口,窗口动画的设定,窗口大小的设定,窗口层级的设定,事件派发;
4. 工作方式:WMS为SystemServer提供了wmHandlerThread,使得SystemServer中的其他Service可以往wmHandlerThread中投递事件,方便WMS处理;
5. AMS和WMS在同一个进程中,可以相互调用;应用程序通过调用openSession获得IWindowSession来访问WMS的功能,WMS通过IWindow来回调应用程序的功能;
6. 应用程序调用IWindowSession::relayout(IWindow),用于WMS回调应用程序,IWindow的实现类是W,提供了resized,dispatchAppVisibility和dispatchScreenState等接口,用于WMS实时通知应用程序界面上的变化;
7. WMS利用WindowState来保存一个窗口相关信息,用AppWindowToken来对应AMS中的一个ActivityRecord;


二、窗口属性
1. 类型与层级:普通窗口,系统窗口,子窗口
2. 窗口策略:PhoneWindow
3. 窗口属性:WindowManager.LayoutParams中,包含Type,Flags,systemUiVisibility等;


三、窗口添加过程
1. mWindowManager.addView(view, WindowManager.LayoutParams),其中mWindowManager的实现是WindowManagerImpl,内部由WindowManagerGlobal单例实现的;
2. addView中创建了ViewRootImpl,并将ViewRoot、DecorView和wparams分别保存到数组中;
3. ViewRoot.setView(DecorView, wparams, panelParentView)中,调用了requestLayout,内部调用了scheduleTraversals,进行measure,layout和draw;
4. ViewRoot的setView中还调用了mWindowSession.addToDisplay(IWindow),讲当前窗口注册到WMS中;
5. 在WMS的addWindow中,创建了WindowState保存新的IWindow,还创建了WindowToken,保存当前的ActivityRecord,对所有Window进行排序;


四、Surface管理
1. WMS原则上只负责管理窗口的层级和属性,而SF才是真正讲窗口数据合成并最终显示到屏幕上的系统服务;WMS在对窗口大小或ZOrder做出调整后也必须通知SF;
2. ViewRoot进行performTraversals时,调用relayoutWindow,进而调用mWindowSession的relayout,向WMS申请一个Surface;
3. WMS中的relayoutWindow,根据窗口的可见性生成Surface,并分配层值;
4. WMS得到ISurfaceComposerClient,调用它的createSurface,获得SurfaceControl,内含IGraphicBufferProducer;
5. WMS将SurfaceControl拷贝给应用程序,应用程序用其中内含的IGraphicBufferProducer建立一个C++层的Surface;
6. performLayoutAndPlaceSurfacesLocked,对窗口的变更进行计算,如计算大小,动画等,并通过SurfaceControl应用到SurfaceFlinger中;


五、启动窗口的添加与销毁


六、窗口动画


GUI系统之View体系


1. canvas = mSurface.lockCanvas(dirty)
2. mView.draw(canvas)
3. surface.unlockCanvasAndPost(canvas)
4. Bitmap, Canvas, Primitive, Paint
5. 其中lockCanvas的作用是调用dequeueBuffer,从buffer队列中dequeue一个可用的buffer,并lock住防止别人使用;
6. unlockCanvasAndPost调用了unlock解除锁定,并调用queueBuffer入队;



0 0
原创粉丝点击