[whatwg] Canvas in workers

Robert O'Callahan robert at ocallahan.org
Sun Oct 13 14:42:54 PDT 2013


On Sun, Oct 13, 2013 at 12:12 PM, Glenn Maynard <glenn at zewt.org> wrote:

>  On Sat, Oct 12, 2013 at 11:12 PM, Kyle Huey <me at kylehuey.com> wrote:
>
> >    1. Rename CanvasProxy to WorkerCanvas and only allow it to be
> >    transferred to workers.  I don't think we're interested in supporting
> >    cross-origin <canvas> via CanvasProxy (I would be curious to hear more
> >    about what the use cases are).
> >
>
> You can transfer data to a worker that's cross-origin, if you have a
> MessagePort where the other side goes to another origin's worker (possibly
> given to you via eg. window.postMessage).
>
> Is the real goal here trying to limit this to threads and avoid IPC, or is
> this actually a cross-origin concern?
>

Basically it's simpler to have CanvasProxy/WorkerCanvas only supported on
workers. Cross-origin isn't itself a concern.


>    2. Add a worker-only WorkerCanvas constructor that takes the desired
> >    width/height of the drawing surface.
> >
>
> This looks like it's trying to allow entirely off-screen rendering within a
> Worker, which is fine, but there's no way to resize the backing store in
> this mode.
>

We don't have a use-case for resizing the backing store of a worker-created
canvas.

> simply draw in a loop without yielding.  To solve this, if commit is
> called
> > and the current dimensions on the main thread don't match the dimensions
> of
> > the WorkerCanvas it would fail (return false) and update the dimensions
> of
> > the WorkerCanvas before returning.  This is technically a violation of
> > run-to-completion semantics, but is needed to support workers that do not
> > yield.
> >
>
> This sounds like it's easy to get wrong, since it'll probably be rare.  An
> exception might be better, so if you don't handle it you at least get an
> error logged to the console.
>

Sure, that's probably better.

There will be flicker issues with this.  The canvas is cleared when you
> change width or height.  In the UI thread that's OK, since the author can
> synchronously redraw immediately after changing the size.  Here, it's
> likely it won't be redrawn in time, so it'll flicker whenever the size
> changes, especially if it's being changed smoothly.  Here's a suggestion to
> fix this:
>
> - When the UI thread changes Canvas.width or Canvas.height, it doesn't
> actually resize buffers.  Instead, it sends a message to the WorkerCanvas
> asking for the change.  Until the change actually happens, the Canvas
> continues to be composited as before.  (However, the change to .width and
> .height is visible on the object immediately.)
> - When the WorkerCanvas's event loop receives a message asking for a size
> change:
>   - Change the size of the back-buffer, and update WorkerCanvas.width and
> WorkerCanvas.height accordingly.
>   - Fire onresize on the WorkerCanvas.  The worker is expected to redraw
> here.  (This is where the "implicit commit" matters: we want to guarantee a
> commit here.)
>   - Only when the newly-redrawn buffer is committed does the front buffer's
> size get updated to match the back-buffer.
>
> In other words, when you change the size in the UI thread, it continues to
> composite the same image (possibly not filling the whole element, or being
> stretched) until the worker actually gets the resize and has a chance to
> redraw it.
>
> This also means the idea of not being able to commit because of a resize
> can go away, and commit() can be void, since the back-buffer size never
> actually changes while the worker is drawing.
>

There is the slight problem that changing both width and height would fire
two events.

A bigger problem is that your approach isn't compatible with a worker that
draws frames in a loop without yielding. I'm uncertain how important that
is, so I'll wait for Kyle to address that.

Rob
-- 
Jtehsauts  tshaei dS,o n" Wohfy  Mdaon  yhoaus  eanuttehrotraiitny  eovni
le atrhtohu gthot sf oirng iyvoeu rs ihnesa.r"t sS?o  Whhei csha iids  teoa
stiheer :p atroa lsyazye,d  'mYaonu,r  "sGients  uapr,e  tfaokreg iyvoeunr,
'm aotr  atnod  sgaoy ,h o'mGee.t"  uTph eann dt hwea lmka'n?  gBoutt  uIp
waanndt  wyeonut  thoo mken.o w  *
*



More information about the whatwg mailing list