W3C home > Mailing lists > Public > public-webapps@w3.org > April to June 2014

Re: [Gamepad] Liveness of Gamepad objects

From: Ted Mielczarek <ted@mozilla.com>
Date: Tue, 29 Apr 2014 14:45:07 -0400
Message-ID: <535FF333.7060307@mozilla.com>
To: Brandon Jones <bajones@google.com>
CC: WebApps WG <public-webapps@w3.org>
On 4/29/2014 1:34 PM, Brandon Jones wrote:
> I don't think that API design should be driven by implementation
> details, but it may be useful to provide some background on Chrome's
> Gamepad implementation here:
>
> The current polling-only API Chrome uses is largely due to
> practicality with the multiprocess architecture. The gamepad data is
> acquired in the central browser process, placed in shared memory, and
> then polled by the tab processes when getGamepads() is called. This
> cuts down on a lot of IPC overhead that would otherwise result from
> constant "Hey, Gamepad N changed!" messages broadcast to all tabs.
>
> Given that, if we decide that the gamepad objects should be live and
> not snapshots I think that Chrome will probably put a system in place
> where the first access of a gamepad object property does a
> behind-the-scenes poll and then does not poll again until control has
> been given back to the browser. (Which is probably not an issue since
> many games will be processing input in a rAF loop.) I can't think of
> any scenario where a forced policy of "one update per frame" would be
> detrimental, but I'm open to feedback on the matter.
I think what I'll wind up writing in the spec will describe the liveness
in terms of tasks[1], which is how web specs talk about the event loop
nowadays. Something like "changes in the state of the gamepad should
queue a task in the task queue to update the state of the Gamepad
object". So your proposed implementation would match that exactly, which
is nice. This is what we're already doing in Firefox, either by virtue
of simply handling input on the main thread, or posting events from a
background thread that's handling input.

Performance-wise, I think this will wind up being functionally
equivalent to your existing implementation anyway--assuming that content
is polling navigator.getGamepads() in a rAF loop, you're going to be
delivering one state update per frame anyway.

>
> If it were my call I'd vote for gamepad objects being snapshots simply
> because it will add some additional overhead to make them live and it
> avoid concerns about observing GC, but I don't really object to either
> design.
>
Anne mentioned the observable GC concern, he said the spec should state
that the lifetime of Gamepad objects is tied to the lifetime of the
global, which isn't too terrible. (There aren't going to be a ton of
them in play anyway.)

I agree that having to make an architectural change like this sucks, I
wish I had spec'ed it better from the beginning. I certainly don't want
to enforce the Firefox implementation as correct just because it's mine,
that's why I started this discussion.

-Ted

1.
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#concept-task
Received on Tuesday, 29 April 2014 18:45:35 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 18:14:24 UTC