> 2) UIWorker: some kind of JS worker that receives callbacks during composition; each callback can take inputs such as time and scroll position(s) as inputs and can update certain CSS properties (e.g. transforms, opacity) on elements that the compositor then uses. > > How should we explain the CSS effects of UIWorkers? A promising idea is to extend the Web Animations API to allow adding a new kind of animation effect to DOM elements --- a UIWorker-controlled effect. Essentially the UIWorker would then be responsible for computing the output of the timing function in each frame. The UIWorker could then animate *any* CSS property, though most property updates would require a round trip through main thread layout/rendering before they get rendered.
This sounds great from Servo's point of view. I'd like to suggest that we allow browsers to expand the set of properties that can be set off the main thread beyond the set that are considered "compositor" or "accelerated" properties today. (This was my main issue with Google's "AnimationProxy": it exposed an API tailored only to those properties that could be handled without a round trip through layout in current browser architectures, but browser engines that have off-main-thread layout like Servo need not restrict themselves to those.) CSS transitions as implemented in my work-in-progress Servo branch go through a "back door" into layout that allows them to directly poke property values into the layout data structures without ever looking at the DOM (i.e. without going through the "front door" of CSS style recalc), which allows script to run concurrently with all CSS transitions. Since we went through such pains to make this "back door" work in Servo, it seems desirable to expose it directly to Web authors, and UIWorker sounds like as reasonable an approach as any. Patrick On Thu, Feb 19, 2015 at 6:27 PM, Robert O'Callahan <rob...@ocallahan.org> wrote: > Last week in Sydney I spent a lot of time talking to Chrome devs about > different approaches for 60fps effects in Web pages. There are three > different kinds of approaches being discussed (so far): > 1) Apple's animation-timeline proposal, which lets CSS animations use > scroll position as an input instead of time. > 2) UIWorker: some kind of JS worker that receives callbacks during > composition; each callback can take inputs such as time and scroll > position(s) as inputs and can update certain CSS properties (e.g. > transforms, opacity) on elements that the compositor then uses. > 3) Provide a way for pages to turn off async scrolling and make everything > fast enough (and isolated enough) for pages to do 60fps updates from their > main thread. > > All of these approaches have problems. Approach #1 is much more limited in > its expressiveness than the alternatives. Approach #3 is more fragile and > less composable than the alternatives --- sharing your main thread with any > JS you don't control could cause jank. I like #2. It's strictly more > powerful than #1 without the downsides of #3. > > Obvious question: how do we stop UIWorkers janking the compositor? We could > give them a time budget (say 8ms). If a worker blows its budget, we notify > it by sending it an event, we give up on it and composite anyway, and we > run it separately from the compositor for a while. This requires an API > design that lets UIWorkers still work, with some lag, when the compositor > is not blocking on them, but that seems doable. > > Should UIWorkers have access to the full Worker API? It seems like there's > no reason not to give them that. > > How should we explain the CSS effects of UIWorkers? A promising idea is to > extend the Web Animations API to allow adding a new kind of animation > effect to DOM elements --- a UIWorker-controlled effect. Essentially the > UIWorker would then be responsible for computing the output of the timing > function in each frame. The UIWorker could then animate *any* CSS property, > though most property updates would require a round trip through main thread > layout/rendering before they get rendered. > > One good thing about UIWorkers is extensibility. We can imagine providing > touch input coordinates to UIWorkers to enable 60fps object dragging (with > arbitrary effects like resistance, snapping, etc). UIWorkers could render > to canvases: this would let you render VR with minimum latency, and let you > render to canvases used by CSS masking for 60fps dissolves and clipping > effects. If you really want to, you could go all Flipboard and render your > entire UI to a canvas in the compositor --- if you keep hitting your > deadlines. > > I like the idea of doing #2 before either #1 or #3. > > Rob > -- > oIo otoeololo oyooouo otohoaoto oaonoyooonoeo owohooo oioso oaonogoroyo > owoiotoho oao oboroootohoeoro oooro osoiosotoeoro owoiololo oboeo > osouobojoeocoto otooo ojouodogomoeonoto.o oAogoaoiono,o oaonoyooonoeo > owohooo > osoaoyoso otooo oao oboroootohoeoro oooro osoiosotoeoro,o o‘oRoaocoao,o’o > oioso > oaonosowoeoroaoboloeo otooo otohoeo ocooouoroto.o oAonodo oaonoyooonoeo > owohooo > osoaoyoso,o o‘oYooouo ofooooolo!o’o owoiololo oboeo oiono odoaonogoeoro > ooofo > otohoeo ofoioroeo ooofo ohoeololo. > _______________________________________________ > dev-platform mailing list > dev-platf...@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-platform > _______________________________________________ dev-servo mailing list dev-servo@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-servo