- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Wed, 07 May 2014 11:47:54 +0900
- To: "public-fx@w3.org" <public-fx@w3.org>
Hi, Following up on the discussion in the last telcon[1] here is a strawman proposal for one way to approach start times in Web Animations. Problem: Creating new animations to start at the current time, where current time=time of last sample, is problematic for two reasons: 1. Sometimes the distance between the last sample and the next one is massive e.g. If we have a hidden iframe, we might decide not to sample it all. As a result the current time won't change. If we later add animations based on that current time as their start time and then unhide the iframe we'll jump well into the animations or probably past them. Likewise if you sleep your laptop you get the same problem. You'll also see it if you're in a background tab that's been throttled really low. 2. Sometimes the first render takes a long time because there is some overhead in setting up the animation meaning you skip several of the first few frames. e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=790592 Straw man proposal: * Element.animate(), AnimationTimeline.play() etc. create a player with a *pending* start time. Querying the computed timing at this point will just give you back mostly null/dummy times for properties like "localTime" much like you'd get if the player wasn't attached to a timeline. * When the UA has rendered the first frame, it resolves the start time allowing all the other computed timings to be resolved. * AnimationPlayer has a 'ready' attribute that is a Promise that is resolved with the start time once the player starts. Question: How do you synchronize stuff while the player has a pending start time? Answers: (1) Stick the stuff in an animation group/sequence (2) Use AnimationPlayer.ready to setup dependent actions that can't be expressed in a group Possible additional answer: We *could* also say that, all players that were made pending at the same sample time, are resolved with the same start time. However, I'm not sure if that would impose unnecessary architectural restraints (e.g. if one animation is to be run in a different process but there is overhead in doing so, should we require UAs to delay all other pending animations from that sample moment until it is set up?) Supposing we *did* do that, then you'd have another means of synchronizing. Just call play()/animate() within the same execution context/task and the independent animations will start in sync. (If you need them to be offset, use the source content's delay.) Best regards, Brian [1] http://lists.w3.org/Archives/Public/public-fx/2014AprJun/0082.html
Received on Wednesday, 7 May 2014 02:48:32 UTC