Lock free animations (2/2)
Second CL that migrates WSA to use SurfaceAnimator We start our synchronized app transition journey by showing that the concept works by using WindowState animations as proof of concept. The main class in this CL are SurfaceAnimator and SurfaceAnimatorRunner. When we start an animation on a Window, we create a new bufferless surface, called "The Leash", in the hierarchy and attach the surface of WindowState onto it, while attaching the leash onto the old surface parent which is still responsible for z-layering. Then, we pass off the Leash into SurfaceAnimationRunner, which then changes the surface properties of Leash in every animation frame, without holding the WM lock. While it's doing that we can still update the z-layering of the window, or even relayout the window of needed - the important surfaces for this are still under WM's control. In case the animation is finished the window surface gets reparented to its original parent, and the leash is abandoned. Note that the reparenting is done in the same transaction as processing the animation finish, such that we don't end up with a flicker in case of a disappearing animation, where the window surface gets destroyed. In case the animation needs to be cancelled, WM can revoke control of the leash by reparenting the window surface. Even if the cancellation signal is heavily delayed, WM immediately regains control over the surface by reparenting it within a transaction. We also introduce the concept of animating a WindowContainer. We clean up isAnimating: - isLocalAnimating: is the container itself animating - isAnimating: is the container or one of its parents animating - isSelfOrChildAnimating: is local animating or any child animating. SurfaceAnimationRunner also needs it's own thread so it's not getting bogged down by any WM lock contention by processing regular animation frames. We call that thread android.anim.lf (lockfree). Now, imagine that SurfaceAnimationAnimator would sit behind an IPC in another process and instead of animating WindowState, we'd animate AppWindowToken. Then, synchronized app transitions would be done. Test: go/wm-smoke Test: SurfaceAnimatorTest Test: SurfaceAnimationRunnerTest Test: WindowContainerTests Bug: 64674361 Change-Id: Idf59daa90361af57fce1128d19a0c0dbf5971d18
Loading
Please register or sign in to comment