systrace学习笔记

App申请buffer

1、当App需要Buffer时,它通过调用dequeueBuffer()并指定Buffer的宽度,高度,像素格式和使用标志,从BufferQueue请求释放Buffer
2、App可以用cpu进行渲染也可以调用用gpu来进行渲染,渲染完成后,通过调用queueBuffer()将缓冲区返回到App对应的BufferQueue(如果是gpu渲染的话,这里还有个gpu处理的过程)
3、SurfaceFlinger在收到Vsync信号之后,开始准备合成,使用acquireBuffer()获取App对应的BufferQueue中的Buffer并进行合成操作
4、合成结束后,SurfaceFlinger将通过调用releaseBuffer()将Buffer返回到App对应的BufferQueue

systrace学习笔记_第1张图片

app启动流程

1、启动APP进程:当我们点击Launcher桌面程序的APP图标时,Launcher程序会调用startActivity()函数,通过Binder跨进程通信,发送消息给system_server进程。在system_server进程中,由AMS通过socket通信告知Zygote进程fork出一个子进程(APP进程)。

2、开启APP主线程:APP进程启动后,会实例化一个ActivityThread,并执行其main函数,同时会创建ApplicationThread、Looper、Handler对象,开启主线程消息循环Looper.loop()。

3、创建并初始化Application和Activity:ActivityThread的main函数通过调用attach方法进行Binder通信,通知system_server进程执行AMS的attachApplication方法。在attachApplication方法中,AMS分别通过bindApplication、scheduleLaunchActivity方法,通知APP进程的主线程Handler,对APP进程的Application和Activity进行初始化,并执行Application、Activity的生命周期。

4、UI布局和绘制:主线程Handler初始化Activity时,会执行创建PhoneWindow、初始化DecorView的操作,并且添加布局到DecorView的ContentView中。ContentView,对应着Activity的setContentView中设置的layout.xml布局文件所在的最外层父布局。
systrace学习笔记_第2张图片

Input流程

1、每隔几秒扫描一次,如果有触摸事件上报给对应的驱动
2、Inputreader读取触摸事件交给inputdispatcher进行事件派发
3、Inputdispatcher将触摸事件发给注册input事件的APP
4、APP拿到事件,进行input事件分发。UI改变会请求vsync信号,进行一帧绘制

SurfaceFlinger和HWC的交互图

systrace学习笔记_第3张图片

Android图形数据流向

1.第一阶段:App在收到Vsync-App的时候,在主线程进行measure、layout、draw(构建DisplayList,里面包含OpenGL渲染需要的命令及数据)。这里对应的Systrace中的主线程 doFrame 操作
2.第二阶段:CPU将数据上传(共享或者拷贝)给GPU, 这里ARM设备内存一般是GPU和CPU共享内存。这里对应的Systrace中的渲染线程的 flushdrawingcommands 操作
3.第三阶段:通知GPU渲染,真机一般不会阻塞等待GPU渲染结束,CPU通知结束后就返回继续执行其他任务,使用Fence机制辅助GPUCPU进行同步操作
4.第四阶段:swapBuffers,并通知SurfaceFlinger图层合成。这里对应的Systrace中的渲染线程的 eglSwapBuffersWithDamageKHR 操作
5.第五阶段:SurfaceFlinger开始合成图层,如果之前提交的GPU渲染任务没结束,则等待GPU渲染完成,再合成(Fence机制),合成依然是依赖GPU,不过这就是下一个任务了.这里对应的Systrace中的SurfaceFlinger主线程的onMessageReceived操作(包括handleTransaction、handleMessageInvalidate、handleMessageRefresh)SurfaceFlinger在合成的时候,会将一些合成工作委托给HardwareComposer,从而降低来自OpenGL和GPU的负载,只有HardwareComposer无法处理的图层,或者指定用OpenGL处理的图层,其他的图层偶会使用HardwareComposer进行合成
6.第六阶段:最终合成好的数据放到屏幕对应的FrameBuffer中,固定刷新的时候就可以看到了

UIthread和renderthread的作用

systrace学习笔记_第4张图片

APP处理一帧数据的流程

systrace学习笔记_第5张图片
1.主线程处于Sleep状态,等待Vsync信号
2.Vsync信号到来,主线程被唤醒,Choreographer回调FrameDisplayEventReceiver.onVsync开始一帧的绘制
3.处理App这一帧的Input事件(如果有的话)
4.处理App这一帧的Animation事件(如果有的话)
5.处理App这一帧的Traversal事件(如果有的话)
6.主线程与渲染线程同步渲染数据,同步结束后,主线程结束一帧的绘制,可以继续处理下一个Message(如果有的话,IdleHandler如果不为空,这时候也会触发处理),或者进入Sleep状态等待下一个Vsync
7.渲染线程首先需要从BufferQueue里面取一个Buffer(dequeueBuffer),进行数据处理之后,调用OpenGL相关的函数,真正地进行渲染操作,然后将这个渲染好的Buffer还给BufferQueue(queueBuffer),SurfaceFlinger在Vsync-SF到了之后,将所有准备好的Buffer取出进行合成(这个流程在讲SurfaceFlinger的时候会提到)

Android 显示一帧的流程

  1. App 接收到 vsync-app 信号后开始工作。
  2. App 主线程被Message唤醒,执行onVsync。
  3. App 执行 doFrame ,处理input、animation、traversal、draw等。
  4. App UIThread 跟RenderThread sync 数据。
  5. App 执行DrawFrame,从SurfaceFlinger的 BufferQueue 中 Dequeue buffer,取出一个bufffer后,执行渲染绘制,接着将绘制好的Buffer 通过queuebuffer 放回到。BufferQueue中给 SurfaceFlinger消费。
  6. App queuebuffer 后, SurfaceFlinger中对应的 app buffer 会增加 +1。
  7. Vsync-sf 到来后,SurfaceFlinger从BufferQueue 中 acquireBuffer一个Buffer 进行消费, 对应SF 中的 app buffer 会减 - 1 , SurfaceFlinger消费处理后,通过 releaseBuffer 将buffer 归还到BufferQueue 中。
  8. SurfaceFlinger通过 bind 跟 Hardware Composer HAL(简称HWC) 进行通信,通过一些处理后显示到手机屏幕上。

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