- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Thu, 09 Aug 2012 13:51:10 +0900
- To: François REMY <fremycompany_pub@yahoo.fr>
- CC: public-fx@w3.org
(2012/08/08 16:43), François REMY wrote: > | I re-read your previous mail about (non-)seekable groups. I think the > | hasSeekableParent property actually needs to look right up the tree. > > Yes, true. If a child animation is seekable, you can't drop the parent > animation once if finishes since the child can still be seeked. However, > you can drop the other (non-seekable) children. Oh, I was thinking the other way around. If an ancestor is seekable you can't drop any of the children since they could become re-activated if you seek the ancestor. Unless you're suggesting that non-seekable items keep playing independently of their parents once started? > | One alternative is to prevent all seeking of the effects timeline and > | its descendants and re-work reverse to spawn a new animation. That would > | let implementations optimise fill: forwards by replacing such animations > | with a single value. > > This is basicly what I propose, indeed. This model is the most > optimizable model and should therefore be the default one. I had a bit more of a think about this optimisation and I think more is needed for forwards filling. The difficulty is that if an animation is filling it will still be in the animation tree. As a result an implementation can't just replace it will a single value since it will still be possible to access the full object by walking the tree. I'm not sure what yet to do about this. In part, I wonder how important it is to optimise this since there are many strategies for efficiently storing common properties of similar animations like you mentioned later on regarding templates. I have to think about this a bit more. > However, you can reach this without using an "effect" timeline at all. > If animations and animations groups are non-seekable by default and you > need to specify a parameter (or change a property value, or call a > method or...) to mark them as seekable, you can achieve the exact same > behavior using one root timeline only. A single timeline could contain > both optimizable and non-optimizable animations, that's it. I don't see > the point of creating two timelines and creating special rules for each > one of them while we could merge that in a single concept. Ok, I understand a bit better what you're saying. I think we felt that the uses of animations is so different to warrant separation. For example, if you have an app with both cartoons (seekable) and UI effects (not-seekable). You probably want to be able to pause all the cartoons but not the UI effects. Of course, you can do that by adding top-level groups, but it seems like such a common paradigm that it should be available by default. (Of course, if you were suggesting that "non-seekable" means "continues to play independent on the parent time once started" then you can do that. But I'm not sure if that's what you had in mind and if it is it's a completely different discussion.) Bear in mind that CSS Transitions would default to a non-seekable timeline, but SVG Animations would default to a seekable timeline (for backwards compatibility). In a model where objects are only optimisable if all ancestors are non-seekable then we probably need some means for getting SVG animations out of their default group to benefit from optimisation. That was also part of the thinking behind the effects timeline. That said, there are still lots of areas I'm not sure about. > BTW, I found an important reason to keep templating: if we can use > templates, we can save memory by storing the property values once. > However, we can get rid of the AnimInstance entirely if we use a model > where animations can have a sequence<Element> instead of an Element as > target. > > let anim = new Anim(...); > anim.targets.push(document.getElementById("a")); > anim.targets.push(document.querySelectorAll("a")); > > let anim2 = anim.makeIndependent( > document.querySelectorAll("a.external") > ); > > anim.targets == #a, a:not(.external) > anim2.targets == a.external I'm not sure templates are necessary for efficient storage (even if we were to go with a cloning model, the clone can just point to its source for its values and use copy-on-write for changes), but I think I'm still in favour of keeping them. The difficulty with making Anim objects refer to multiple targets is you often want the targets to have different timing, particularly different start times and pause states. For example, the animations generated by a CSS Animation declaration have different start times. CSS Transitions reverse independently of one another. Once you include the ability for different targets in the sequence to have different timing, you basically end up with per-elem Anim instances (especially if you assume the storage for shared properties is optimised in ways like you mentioned). > | Yes, I agree. Shane has a proposal for this which we want to incorporate > | in the future.[1] > > I like his proposal! Using CSS Custom Properties to specify the state > changes is very clever! Syntax could be reworked but globally I feel the > idea is right. I didn't really understand the @node(...) proposal but I > guess it's a bit like my "when(...)" concept. > > Since transitions are an important use case of animations, I think > incorporating this proposal is important as well. At least, we need to > make sure its incorporation will not require additionnal concepts. Yes, we've added a few concepts to make supporting this proposal easier in the future. I think Shane also had some reservations about the @node(...) part. As soon as we can settle on a good base model, we can work on layering this on top. Thanks, Brian
Received on Thursday, 9 August 2012 04:51:41 UTC