android Surface绘制状态流转-WindowStateAnimator

/**
 * Keep track of animations and surface operations for a single WindowState.
 **/
class WindowStateAnimator {
    /** This is set when there is no Surface */
    static final int NO_SURFACE = 0;
    /** This is set after the Surface has been created but before the window has been drawn. During
     * this time the surface is hidden. */
    static final int DRAW_PENDING = 1;
    /** This is set after the window has finished drawing for the first time but before its surface
     * is shown.  The surface will be displayed when the next layout is run. */
    static final int COMMIT_DRAW_PENDING = 2;
    /** This is set during the time after the window's drawing has been committed, and before its
     * surface is actually shown.  It is used to delay showing the surface until all windows in a
     * token are ready to be shown. */
    static final int READY_TO_SHOW = 3;
    /** Set when the window has been shown in the screen the first time. */
    static final int HAS_DRAWN = 4;

WindowStateAnimator 是 WMS 中每个窗口对应的 Surface 动画与绘制状态管理器。它维护了从 Surface 创建到最终显示到屏幕的完整生命周期,核心职责包括:

职责说明
Surface 生命周期管理创建 (createSurfaceLocked)、销毁 (destroySurfaceLocked) 窗口的 SurfaceControl
绘制状态机管理 mDrawState 的 5 个状态流转(核心机制)
Surface 属性控制控制透明度 (setAlpha)、可见性 (show/hide)、不透明度 (setOpaque)、颜色空间等
入场动画applyEnterAnimationLocked() 为窗口首次显示播放动画
Transaction 提交finishDrawingLocked() 将客户端的 postDrawTransaction 合并到 getSyncTransaction()

完整时序图

SurfaceControlWindowStateAnimator(绘制状态机)WindowStateWindowManagerService应用客户端(ViewRootImpl)SurfaceControlWindowStateAnimator(绘制状态机)WindowStateWindowManagerService应用客户端(ViewRootImpl)阶段1: Surface 创建 (NO_SURFACE → DRAW_PENDING)mDrawState = NO_SURFACESurface 已创建但隐藏mDrawState = DRAW_PENDING阶段2: 客户端首次绘制完成 (DRAW_PENDING → COMMIT_DRAW_PENDING)状态转换合并事务到同步组alt[mDrawState == DRAW_PENDING]阶段3: 布局提交与准备显示 (COMMIT_DRAW_PENDING → READY_TO_SHOW)状态转换检查 Activity 生命周期alt[mDrawState == COMMIT_DRAW_PENDING]阶段4: 最终显示 (READY_TO_SHOW → HAS_DRAWN)验证显示条件应用进入动画(如果需要)状态转换触发动画帧渲染alt[mDrawState == READY_TO_SHOW && isReadyForDisplay()]阶段5: 正常显示循环 (HAS_DRAWN 状态)alt[mDrawState == HAS_DRAWN && !mLastHidden][mDrawState != HAS_DRAWN || mLastHidden]loop[每帧渲染]阶段6: 窗口销毁 (任意状态 → NO_SURFACE)销毁 Surface 资源状态重置relayoutWindow() 请求创建窗口创建 WindowState构造 WindowStateAnimatorcreateSurfaceLocked()创建 SurfaceControl (HIDDEN标志)resetDrawState()返回 Surface,等待客户端绘制执行 onDraw() 渲染内容finishDrawing() 通知绘制完成finishDrawing(postDrawTransaction, syncSeqId)finishDrawingLocked(postDrawTransaction)mDrawState = COMMIT_DRAW_PENDINGgetSyncTransaction().merge(postDrawTransaction)返回 layoutNeeded = trueperformLayoutAndPlaceSurfaces()commitFinishDrawingLocked()commitFinishDrawingLocked()mDrawState = READY_TO_SHOWperformShowLocked()performShowLocked()检查 showToCurrentUser()检查 mActivityRecord.canShowWindows()applyEnterAnimationLocked()mDrawState = HAS_DRAWNscheduleAnimationLocked()递归调用子窗口 performShowLocked()prepareSurfaceLocked(transaction)transaction.show(mSurfaceControl)setShown(true)transaction.hide(mSurfaceControl)setShown(false)移除窗口或 Activity 停止destroySurface(cleanupOnResume, appStopped)destroySurfaceUnchecked()destroySurfaceLocked(transaction)transaction.remove(mSurfaceControl)setShown(false)mSurfaceControl = nullmDrawState = NO_SURFACEmAnimatingExit = false

BUFFER 的 fence 机制
当 App 通过 eglSwapBuffers / queueBuffer 将 buffer 提交给 BLASTBufferQueue 时,buffer 带有一个 fence(GraphicBuffer 的 acquireFence):

当 App 通过 eglSwapBuffers / queueBuffer 将 buffer 提交给 BLASTBufferQueue 时,buffer 带有一个 fence(GraphicBufferacquireFence):

queueBuffer(buffer, fence) → BBQ
                               │
                               ├── buffer 进入 BBQ 的待处理队列
                               ├── fence 被附加到 Transaction 中
                               └── Transaction → SF
                                     │
                                     ├── SF: t.show() → Surface 可见
                                     ├── SF: 尝试合成 buffer
                                     ├── SF: 发现 fence 未 signal
                                     ├── SF: 等待 fence  ← GPU 仍在渲染
                                     ├── ... GPU 完成 → fence signal
                                     └── SF: 合成并显示

绘制状态与屏显的关系

时间点事件GPU 状态mDrawState
T1GPU 命令提交,queueBuffer渲染中DRAW_PENDING
T2finishDrawing() → WMS渲染中COMMIT_DRAW_PENDING
T3commitFinishDrawingLocked()渲染中READY_TO_SHOW
T4performShowLocked()渲染中HAS_DRAWN
T5showRobustly()t.show()渲染中HAS_DRAWN
T6GPU fence signal完成 ✅HAS_DRAWN
T7SF 合成并显示完成HAS_DRAWN

HAS_DRAWN 是 WMS 侧的"决策状态",不是 GPU 侧的"完成状态"。从 HAS_DRAWN 设置到 GPU 真正完成渲染之间的时间差,由 buffer 的 acquire fence 机制来保证画面正确性——SF 会在合成前自动等待 fence,不会出现显示不完整帧的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值