- From: Shane Stephens <shans@google.com>
- Date: Tue, 14 Jul 2015 23:37:12 +0000
- To: Brian Birtles <bbirtles@mozilla.com>, "public-fx@w3.org" <public-fx@w3.org>
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>
- Message-ID: <CAGTfzwQBjPer-A=N1a_h+Ok6iB+eCFbuPpBJANr_CCTaqwLiRg@mail.gmail.com>
Replying in this thread to maintain the context. I think that would be good. I'm afraid I can't quite remember why > creation ordering is better or why this proposal is better. I'm not > opposed to it but I'd like to give others a chance to check it over too. > > Would you mind writing quick summary of the proposal with rationale for > those who haven't been following this thread? (And to that end, starting > a new thread might be better.) > I'm going to generally talk about why changing the order from creation time is bad, and present specific proposals in a future email. But let's start by quickly surveying the orderings provided by declarative animation APIs: * SMIL has animation start time ordering. Thus timing information is used to determine priority, which means that the two can't be different. If you want a different priority to start time (e.g. you want an animation that starts 3s into a sequence to be lower priority than the animations that are already running) - you just can't. In practice, there are partial mitigations - transform animations can be run on parent nodes (i.e. complex animations require extra DOM content); non-transform additive animations are somewhat insensitive to priority (but not entirely). * CSS has text declaration ordering. CSS animation order is governed entirely by animation name order. >From the very first face-to-face meeting discussing web animations we have agreed that the SMIL model is flawed. Over time we've evolved a few different approaches, but until recently we had settled fairly stably upon creation time ordering - that is, the order of creation of animations dictates their priority. This gives a model that is about as similar as a script API can be to CSS animations. Recently, Brian introduced a proposal to try and solve some issues he'd noticed with what happened when CSS animations were accessed via script and 'converted' to script animations. Brian's proposal is to introduce a third sort of ordering - transition-from-idle (TFI) ordering. Transitioning from idle is currently somewhat of a secondary concept in web animations - the normal flow is to create an already running animation (using element.animate), then either let it run to completion or cancel it - so at first blush this proposal looks a lot like the existing behavior. However, looking into the future, constructors for Animations, Effects and Groups will begin to produce stronger differences. My alternative proposals maintain creation ordering and use a different approach to solve the conversion issues. This is primarily because I think that creation ordering is much more usable than TFI ordering, and worth preserving. I have three main reasons for thinking this: (1) TFI ordering has weird behavior: take the following script: var a = new Animation(...); var b = new Animation(...); b.play(); a.play(); // a has priority over b. b.play(); // b does not have priority over a. Huh? b.cancel(); b.play(); // b has priority over a. Unless you've internalized the state machine for animations, the behavior is hard to predict. In contrast, creation ordering would guarantee that b always has priority over a, as it was created second. If the author wants to switch that priority, they simply switch the first two statements. It's a simple model and it's easy to reason about. (2) With TFI ordering, priority changing depends upon state changes. This means that complicated code has hard-to-reason about effects on priority. This is somewhat of a decent into the mistake that SMIL made - priority is now tied to a feature of the animation engine that users want to use for reasons other than priority. In particular, if you want to cancel and later restart an an animation that is at the bottom of the stack (but maintain the ordering), TFI ordering requires you to sequentially cancel, restart, and reset currentTime on every other animation in the stack. (3) It is idiomatic to create animation resources separately from their scheduling. We've already seen a desire to do things like this with declarative animation and triggers, or with time sheets. Creation time ordering ties animation priority to animation creation, which means that you think about the order in which animation resources will layer at the point where you're creating the resources. In contrast, TFI ordering means you need to think about animation resource ordering at each point that you start an animation. This is slightly better than start time ordering, but not much - for example, it means that if you've started other animations in the wrong order with respect to the animation you're about to start, you are out of luck unless you want to apply potentially global updates (your only available operation is to move an animation to the top of the priority stack). For another example, how do you slot a newly played animation in between a high-priority animation and a low-priority one? You can't without restarting the high priority animation. I hope these arguments give a good sense for why I'm opposing the idea of moving away from creation-time ordering. Any questions / counter-arguments? Cheers, -Shane
Received on Tuesday, 14 July 2015 23:37:51 UTC