Android 渲染机制分析,代码基于 Android 12
requestLayout - scheduleTraversals - mChoreographer.postCallback - scheduleFrameLocked - scheduleVsyncLocked - DisplayEventReceiver.scheduleVsync - nativeScheduleVsync
nativeScheduleVsync 在底层通过 requestNextVsync 去请求下一个 Vsync,接收 Vsync 信号后回调到 DisplayEventReceiver.onVsync 方法中,在其中发送了一个 Handler 消息到消息队列,接到消息后执行 DisplayEventReceiver.run(),在 run() 中调用 doFrame() - doCallBacks() - CallbackRecord.run() - TraversalRunnable.run() - doTraversal() - performTraversals(),至此开始绘制流程 performMessure - performLayout - performDraw;
详细流程后续更新;
Surface与Canvas的区别在哪里
Surface和Canvas都有画布的意思
但实际上,Surface才是真正和屏幕管理器打交道的画布
Canvas是对画布操作细节的封装,它更多的是和View、用户打交道
当Canvas完成一轮绘制后,会将绘制结果提交到Surface的缓冲区中,然后由Surface交给屏幕管理器绘制
Surface与Canvas是如何关联的
每个Window对应一个Surface,每个Surface对应一块屏幕缓冲区
SurfaceFlinger按照z轴顺序,将所有Surface的内容逐个绘制出来,就形成了最终的屏幕内容
ViewRootImpl每次执行draw方法时,都会通过对应的Surface创建一个新的Canvas,并指定一个绘制区域DirtyRect
DecorView在指定的Canvas和DirtyRect上,完成当前轮的绘制工作
ViewRootImpl再通过Surface,将Canvas的绘制结果提交到屏幕管理器,同时释放Canvas
当收到新一轮的绘制或刷新指令时,ViewRootImpl会再创建一个新的Canvas,重复以上工作
由此我们可以看出,Surface只有一个,而Canvas有多个,Canvas负责具体细节,而Surface直接和屏幕管理器打交道
参考