Re: Recent Sync XHR changes and impact on automatically translated JavaScript code

On Tue, Mar 20, 2012 at 12:09 PM, Gordon Williams <gw@pur3.co.uk> wrote:

> Hi,
>
> I recently posted on
> https://bugs.webkit.org/show_**bug.cgi?id=72154<https://bugs.webkit.org/show_bug.cgi?id=72154>
> https://bugzilla.mozilla.org/**show_bug.cgi?id=716765<https://bugzilla.mozilla.org/show_bug.cgi?id=716765>
> about the change to XHR which now appears to be working its way into
> Mainstream users' browsers.
>
> As requested, I'll pursue on this list - apologies for the earlier bug
> spam.
>
> My issue is that I have WebGL JavaScript that is machine-generated from a
> binary file - which is itself synchronous. It was working fine:
>
> http://www.morphyre.com/**scenedesign/go<http://www.morphyre.com/scenedesign/go>
>
> It now fails on Firefox (and shortly on Chrome I imagine) because it can't
> get an ArrayBuffer from a synchronous request. It may be possible to split
> the execution and make it asynchronous, however this is a very large
> undertaking as you may get an idea of from looking at the source.
>
> My understanding is that JavaScript Workers won't be able to access WebGL,
> so I am unable to just run the code as a worker.
>
> What options do I have here?
>
> * Extensive rewrite to try and automatically translate the code to be
> asynchronous
> * Use normal Synchronous XHR and send the data I require in text form,
> then turn it back into an ArrayBuffer with JavaScript
>
> Are there any other options?
>
> Right now, #2 is looking like the only sensible option - which is a shame
> as it will drastically decrease the UX.
>
> - Gordon
>
>
>
#1 is the best option long term.  All web platform APIs in the window
context - going forward - are asynchronous and this isn't going to be the
last time someone runs into this issue.

#2 is a reasonable stop gap; and assuming things like large textures are
being downloaded, the text -> preallocated TypedArray copy will be shadowed
by the wait for large I/O to complete from a remote source.

I believe there is a #3, which is a hybrid of sync APIs, Workers, and
message posting.  You can use a worker to perform these sync operations and
post data back to the main UI thread where an event loop/handler runs and
has access to the WebGL context.  Firefox 6+ and Chrome 13+ have support
for the structured cloning...there's overhead involved but it works and
might be an easier translation than creating async JS.  Chrome 17+ has
transferable objects, so data passing is wicked fast.

Jarred

Received on Tuesday, 20 March 2012 17:08:42 UTC