• Khushal's avatar
    cc: Avoid unnecessary pending trees during image animation updates. · a60ea1a3
    Khushal authored
    CURRENT CODE:
    The current flow of animations initiated by the ImageAnimationController
    is as follows:
    
    1) Each time a pending tree is updated, which is when animated images
    from display lists would have been registered with the controller, we
    compute the earliest time the next animation update will be needed and
    schedule a delayed task to trigger an invalidation.
    
    2) The delayed task triggers an invalidation, which update the frame on
    the sync tree created as a result. And schedules the next invalidation
    if needed.
    
    THE BUG:
    In the steps above, first for progressing the animation on the sync tree
    and for scheduling the delayed task, we use the frame_time from the
    BeginFrameArgs of the current frame as the "now" time. This resulted in
    2 bugs:
    
    1) Since the delayed task could be scheduled at any time within the impl
    frame, using the frame_time from BeginFrameArgs as now was incorrect and
    the delayed task would run at an unexpected time.
    
    2) When the task did run at the correct time, resulting in an invalidation,
    the pending tree would not be updated if the frame times of the animation
    did not align with the BeginFrame frame times. For instance, if the frame
    time is 0ms and the animation wants to run at 8ms. Even if the
    invalidation runs at 8ms, the "now" time would be the BeginFrame
    frame_time, which is 0ms and earlier than when the animation wants to run.
    This would create wasted pending trees.
    
    FIX:
    This patch fixes the above by changing some fundamental aspects of how
    image animations are progressed.
    
    1) Instead of respecting the frame durations associated with the animated
    image completely, snap them to frame boundaries. This ensures that the
    animation always starts at the beginning of the frame in which the desired
    time lies. This is also the optimal time to start the work for the frame
    in which the animation wants to update.
    
    2) Instead of always requesting an invalidation at the time for the next
    animation update, request an impl frame instead. At the beginning of the
    impl frame, upgrade it to an invalidation request if the frame_time for
    that impl frame ensures that the animation will be updated.
    This avoids a race between triggering an invalidation and receiving the
    target BeginFrame in the renderer.
    
    R=enne@chromium.org,sunnyps@chromium.org
    
    Change-Id: Iffcaafc3dd72f7649ada1eceea2835054c44e911
    Reviewed-on: https://chromium-review.googlesource.com/c/1464972
    Commit-Queue: Khushal <khushalsagar@chromium.org>
    Reviewed-by: default avatarSunny Sachanandani <sunnyps@chromium.org>
    Reviewed-by: default avatarenne <enne@chromium.org>
    Auto-Submit: Khushal <khushalsagar@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#634935}
    a60ea1a3
layer_tree_host_impl.cc 225 KB