Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-25 Thread Ian Langworth
Thank you all. This is wonderfully helpful.

On Mon, Feb 24, 2014 at 10:07 AM, Vincent Scheib sch...@google.com wrote:

 One way to move forward on those topics is to prototype functional
 solutions on Windows, Mac, and Linux and illuminate a practical solution
 that browsers may adopt. I did an investigation in 2011 and did not find a
 solution. For clipping only I believe Mac was the only platform I didn't
 find a solution for. Windows has ClipCursor() and Linux has XGrabPointer().
 Once we know we can implement the functionality, we can discuss how to
 express this in an API.


On Sun, Feb 23, 2014 at 7:18 AM, Brandon Jones bajo...@google.com wrote:

 - The reason the cursor is hidden when the pointer is locked is that some
 OSes don't have the ability to report relative mouse movement correctly at
 screen edges. This requires the cursors to constantly be reset to the
 center of the screen, which obviously would look strange if the cursor was
 visible.


An OS-level visible cursor with pointer lock would be the holy grail. Maybe
we can spend some time revisiting the implementations of these to prove out
the functionality and push the spec forward a little.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 1:16 AM, Thibaut Despoulain
thib...@artillery.comwrote:

 I've written a test for this here:
 http://codeflow.org/issues/software-cursor.html

 My observation from testing on linux is that I can't distinguish latency
 for the software cursor from the OS cursor (or not by much anyway) in
 google chrome. In firefox however there's noticable lag. Mileage may vary
 for other platforms.


 This is true, but sadly your test runs on an empty animation frame. If
 your main thread is doing a lot of work already (barely hitting the 60fps
 mark, as it is the case for demanding games), the lag will be much more
 perceptible as you will most likely drop a frame every now and then.


I regard dropping below 60fps as an application defect for a realtime
interactive application where the users input is time critical.

*Reasons things drop below 60fps*

   - You trigger GC-ing
   - Your JS main thread takes up more than 16ms
   - Your GPU processing time takes up more than 16ms

*Detecting the problem*

   - You'd detect GC-ing by measuring the rate at which
   requestAnimationFrame is fired. Gaps that appear periodically are typically
   GC related.
   - JS main thread time can be accurately measure with performance.now()
   - GPU time will be measurable with EXT_disjoint_timer_query
   http://www.khronos.org/registry/webgl/extensions/EXT_disjoint_timer_query/

*Solving the problem*

   - Incremental GCs for JS will help. But they're not here yet, so one way
   you can do something right now is to be very careful about the use of [],
   {}, function(){}, new, DOM, createElement, innerHTML etc. It is possible to
   eliminate GC caused frame drop almost entirely that way.
   - Set yourself a time budget for the JS-main thread (that's well below
   16ms) that you'll want to reach even on the lower-end of the expected
   hardware. First try to keep everything below that budget in tests. If
   something simply cannot be done in that time, split up into multi-frame
   processing or shuffle it out to a webworker. Finally, if you still run into
   the problem, keep constant tap on the JS time per frame, and when you run
   over it reduce some processing (as in LOD, quality degradation etc.)
   - EXT_disjoint_timer_query is not yet available, but once it does become
   available you can use it to perform accurate testing on the lower end of
   the hardware spectrum to identify rendering issues. And you can also use it
   to dynamically react to pending performance issues by dialing down the LOD.

*Critical features for this use-case vendors have to offer, and soon*

   - Showing the OS cursor, but containing it into a bounding region as
   determined by a dom element (such as body, other elements)
   - Implementing incremental GCs
   - Implementing EXT_disjoint_timer_query
   - Reducing input - output lag

I will point out that I have consistently called for fixes in these areas
during the last 2-3 years on the various discussions/specs/tickets on these
topics. So it's not surprising to me that these are issues now somebody
actually tries to make a real world, real time application in a browser.
I'm very glad that Artillery is doing the fine work of pushing this
boundary. I'd also like to ask the vendors to go the last mile as quickly
as feasible. Solving these issues is in the end, not just crucial for
realtime applications. Web applications get a lot of criticism for not
being able to compete in quality with native applications. This stems in
large part, from the fact that it is hard to make web applications as
responsive and snappy as native applications.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Thibaut Despoulain
The issue with pointerlock is that it requires the app to draw its own
cursor instead of the OS cursor, which has at least two significant
drawbacks:

   - Significant pointer lag between movement input and actual movement on
   screen compared to an OS-drawn cursor (yes, even at 60fps),
   - Inability to use DOM elements with mouse events for a game overlay/HUD..

We could work around #2, but #1 is a no-go for a twitch game such as a RTS
where mouse accuracy and responsiveness is so critical.

Something like a different kind of pointer lock that uses the OS cursor and
only prevent the cursor from exiting the window canvas would be optimal.


On Sat, Feb 22, 2014 at 2:39 PM, Florian Bösch pya...@gmail.com wrote:

 On Sat, Feb 22, 2014 at 11:22 PM, Florian Bösch pya...@gmail.com wrote:

 Caveat, I think Firefoxes implementaiton of the Pointerlock API might not
 follow the specification yet to make it possible to have pointerlock
 without fullscreen.


 Just checked this against a test I wrote a while ago
 http://codeflow.org/issues/pointerlock-test.html and consulted the
 pointerlock stats for IE. You can get pointerlock in both firefox and
 chrome without fullscreen (you can also get pointerlock and fullscreen
 simultaneously). IE seems to support pointerlock in versions that have
 webgl, but they seem to have added it only recently so support is still low
 (32%).



Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Thibaut Despoulain

 I've written a test for this here:
 http://codeflow.org/issues/software-cursor.html

 My observation from testing on linux is that I can't distinguish latency
 for the software cursor from the OS cursor (or not by much anyway) in
 google chrome. In firefox however there's noticable lag. Mileage may vary
 for other platforms.


This is true, but sadly your test runs on an empty animation frame. If your
main thread is doing a lot of work already (barely hitting the 60fps mark,
as it is the case for demanding games), the lag will be much more
perceptible as you will most likely drop a frame every now and then.

The reason the cursor is hidden when the pointer is locked is that some
 OSes don't have the ability to report relative mouse movement correctly at
 screen edges. This requires the cursors to constantly be reset to the
 center of the screen, which obviously would look strange if the cursor was
 visible.


Would that prevent vendors from implementing a pointer edge grabbing?
(preventing the cursor to exit the window but keeping the OS cursor as-is
while inside of it)



On Sun, Feb 23, 2014 at 7:30 AM, Florian Bösch pya...@gmail.com wrote:

 On Sun, Feb 23, 2014 at 4:18 PM, Brandon Jones bajo...@google.com wrote:

 - it's possible to theme the OS cursor using custom images with CSS.
 https://developer.mozilla.org/en-US/docs/Web/CSS/cursor/url

 Although that doesn't absolve vendors from fixing the latency issue even
 if native pointers where to be made available during pointerlock. The
 reason is that cursors come in more flavors than an image. For example they
 could come in some variety of 3D rendered representations useful for the
 game in question.


 - The reason the cursor is hidden when the pointer is locked is that some
 OSes don't have the ability to report relative mouse movement correctly at
 screen edges. This requires the cursors to constantly be reset to the
 center of the screen, which obviously would look strange if the cursor was
 visible.

 Isn't that only a concern if you want to capture the cursor, not when you
 display the OS cursor?


 - You already mentioned some issues with synthetic mouse events, but
 unfortunately it's worse than you suspect. For example: sending a synthetic
 click event to a checkbox doesn't actually change it's checked state. (Not
 the last time I tried anyway) select controls also have a hard time with
 synthetic events, and there's a whole host of other sub rely broken things.
 :(

 Is there a motivation not to make it work? Clickjacking?



Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Thibaut Despoulain
Also: At the moment we're using CSS cursors to give visual feedback on
in-game hover/action states which works pretty well and is a breeze to
implement.


On Sun, Feb 23, 2014 at 4:16 PM, Thibaut Despoulain
thib...@artillery.comwrote:

 I've written a test for this here:
 http://codeflow.org/issues/software-cursor.html

 My observation from testing on linux is that I can't distinguish latency
 for the software cursor from the OS cursor (or not by much anyway) in
 google chrome. In firefox however there's noticable lag. Mileage may vary
 for other platforms.


 This is true, but sadly your test runs on an empty animation frame. If
 your main thread is doing a lot of work already (barely hitting the 60fps
 mark, as it is the case for demanding games), the lag will be much more
 perceptible as you will most likely drop a frame every now and then.

 The reason the cursor is hidden when the pointer is locked is that some
 OSes don't have the ability to report relative mouse movement correctly at
 screen edges. This requires the cursors to constantly be reset to the
 center of the screen, which obviously would look strange if the cursor was
 visible.


 Would that prevent vendors from implementing a pointer edge grabbing?
 (preventing the cursor to exit the window but keeping the OS cursor as-is
 while inside of it)



 On Sun, Feb 23, 2014 at 7:30 AM, Florian Bösch pya...@gmail.com wrote:

 On Sun, Feb 23, 2014 at 4:18 PM, Brandon Jones bajo...@google.comwrote:

 - it's possible to theme the OS cursor using custom images with CSS.
 https://developer.mozilla.org/en-US/docs/Web/CSS/cursor/url

 Although that doesn't absolve vendors from fixing the latency issue even
 if native pointers where to be made available during pointerlock. The
 reason is that cursors come in more flavors than an image. For example they
 could come in some variety of 3D rendered representations useful for the
 game in question.


 - The reason the cursor is hidden when the pointer is locked is that
 some OSes don't have the ability to report relative mouse movement
 correctly at screen edges. This requires the cursors to constantly be reset
 to the center of the screen, which obviously would look strange if the
 cursor was visible.

 Isn't that only a concern if you want to capture the cursor, not when you
 display the OS cursor?


 - You already mentioned some issues with synthetic mouse events, but
 unfortunately it's worse than you suspect. For example: sending a synthetic
 click event to a checkbox doesn't actually change it's checked state. (Not
 the last time I tried anyway) select controls also have a hard time with
 synthetic events, and there's a whole host of other sub rely broken things.
 :(

 Is there a motivation not to make it work? Clickjacking?





Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Glenn Maynard
On Mon, Feb 24, 2014 at 4:17 AM, Florian Bösch pya...@gmail.com wrote:

 On Mon, Feb 24, 2014 at 1:16 AM, Thibaut Despoulain thib...@artillery.com
  wrote:

  I've written a test for this here:
 http://codeflow.org/issues/software-cursor.html

 My observation from testing on linux is that I can't distinguish latency
 for the software cursor from the OS cursor (or not by much anyway) in
 google chrome. In firefox however there's noticable lag. Mileage may vary
 for other platforms.


 This is true, but sadly your test runs on an empty animation frame. If
 your main thread is doing a lot of work already (barely hitting the 60fps
 mark, as it is the case for demanding games), the lag will be much more
 perceptible as you will most likely drop a frame every now and then.


 I regard dropping below 60fps as an application defect for a realtime
 interactive application where the users input is time critical.


First, mouse input is always time-critical, even if the application itself
is not.  Even for a spreadsheet, the mouse must still move responsively,
since pointing devices are difficult to use with any delay.  Some games
only run graphics at 30 FPS (like it or not), but the pointer if any must
still update at 60 FPS.

Second, system-driven pointers allow better responsiveness than is possible
at the application level.  They can process mouse input and update the
mouse cursor right when the backbuffer is flipped, giving the lowest
possible latency.  Applications (especially web apps) simply can't do that.

Going forward this could be even more severe.  For example, AirPlay video
streaming has significant video delay, but they could send mouse movement
over a sideband and draw it on the rendering device, allowing responsive
mouse movement where it would otherwise be impossible.

It's not the application's job to keep the mouse cursor responsive, it's
the system's.  Hiding the system mouse cursor and drawing one manually is
always a bad idea.

-- 
Glenn Maynard


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 5:18 PM, Glenn Maynard gl...@zewt.org wrote:

 It's not the application's job to keep the mouse cursor responsive, it's
 the system's.  Hiding the system mouse cursor and drawing one manually is
 always a bad idea.


That's a wonderful argument. And now we look at an FPS game,  or an Oculus
Rift title, or something that requires something else than a picture cursor
like say, an on terrain selection, a bounding box selection, a 3D ray
picking selection/cursor, or anything like that.

Always a bad idea, sure. How about you think about that again hm?


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Glenn Maynard
(More reasons: it's very likely that you'll end up implementing a cursor
with different motion and acceleration, a different feel, than the real
mouse cursor.  It also breaks accessibility features, like mouse trails.)

On Mon, Feb 24, 2014 at 10:30 AM, Florian Bösch pya...@gmail.com wrote:

 On Mon, Feb 24, 2014 at 5:18 PM, Glenn Maynard gl...@zewt.org wrote:

 It's not the application's job to keep the mouse cursor responsive, it's
 the system's.  Hiding the system mouse cursor and drawing one manually is
 always a bad idea.


 That's a wonderful argument. And now we look at an FPS game,  or an Oculus
 Rift title, or something that requires something else than a picture cursor
 like say, an on terrain selection, a bounding box selection, a 3D ray
 picking selection/cursor, or anything like that.

 Always a bad idea, sure. How about you think about that again hm?


This doesn't seem to relate to the discussion, which is about mouse
pointers.

-- 
Glenn Maynard


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 5:40 PM, Glenn Maynard gl...@zewt.org wrote:

 (More reasons: it's very likely that you'll end up implementing a cursor
 with different motion and acceleration, a different feel, than the real
 mouse cursor.  It also breaks accessibility features, like mouse trails.)

Oh I agree, if your usecase fits a mouse cursor of the style that the OS
offers, it's definitely preferable to have the OS mouse cursor. And I
distinctly remember arguing prior to the pointerlock specification that it
would be immensely useful to have the ability to show the cursor, but
capture the pointer inside an area. And I was pointed, at the time, to the
solution to draw a software mouse cursor... So now what we're having this
discussion, I find appropriate to have pointed out as a possibility (to
draw the software cursor), which met some, let's call them difficulties.
Now, I also just made a nice list which mentions 4 things to do, among
them, add this ability. I consider this now settled, because I think we all
agree on this. We might just need to agree on the limitations as they
partain to relative mouse movement reporting when you're showing the OS
cursor. And I think that's relatively easy to agree on, you can't rely on
relative motion outside of the constrained area if you show the OS cursor.


 This doesn't seem to relate to the discussion, which is about mouse
 pointers.

It is about input - output, essentially. Intput as it comes from your
pointing device, and output, as it reflects in your application. The OS
mouse cursor is but one example of such reflection. There are many more
usecases that would like to benefit from a low input - output latency, one
example of which is the variety of software cursors which may take the
shape of a picture, or something else completely. But moreover there are
usecases such as viewing controls that have the exact same need, notably
FPS shooters, for instance, or Oculus rift titles and so forth. So, it
matters a great deal to the, because you can alleviate some of the issues
while simultaneously solving a whole host of other issues.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Brendan Eich

Glenn Maynard wrote:
It's not the application's job to keep the mouse cursor responsive, 
it's the system's.  Hiding the system mouse cursor and drawing one 
manually is always a bad idea.


Agreed!

In the same vein, programmers cannot avoid GC pauses without relying on 
pause-free or at least incremental GC (which BTW some browsers' JS 
engines have already, e.g., SpiderMonkey in Firefox), or as a real 
alternative, cross-compiling C or C++ for example via Emscripten, to 
allocate heap memory from a typed array.


Florian, your goals are good, but the means to those ends must involve 
better runtimes or compilers -- not on JS programmers working harder to 
avoid GC while still somehow allocating objects frequently and even 
implicitly.


/be



Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Vincent Scheib
Thank you Ian for the clear use case write up (and to Artillery for
progress on a great product), Florian Brandon and Glenn for discussion 
contributions.

As Florian mentioned, we did discuss this use case in 2011 and at that time
I attempted to summarize the situation in the pointer lock spec FAQ [1].
Please do read that discussion of the related 3 topics of clipping, motion
while clipped, and raw data.

One way to move forward on those topics is to prototype functional
solutions on Windows, Mac, and Linux and illuminate a practical solution
that browsers may adopt. I did an investigation in 2011 and did not find a
solution. For clipping only I believe Mac was the only platform I didn't
find a solution for. Windows has ClipCursor() and Linux has XGrabPointer().
Once we know we can implement the functionality, we can discuss how to
express this in an API.

[1]
https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#why-bundle-all-functionality-hiding-cursor-providing-mouse-deltas-instead-of-using-css-to-hide-the-cursor-always-providing-delta-values-and-offering-an-api-to-restrict-the-cursor-movement-to-a-portion-of-the-web-page


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Thibaut Despoulain
@Florian:
That is very well put. 

Trust me, we are well aware of time budgets and GC pauses. The thing is that 
even when planning frame budgets and object allocations ahead, you still have 
external parameters you cannot really control (ie. Another tab running flash or 
some other intensive task, another software running in the background, etc.). 
This is why an OS-drawn cursor is so critical (in our use case that is, since 
we rely on a simple 2d cursor styled with CSS and not a 3d one)

Furthermore, when targeting low-end hardware, a 30fps render loop is enough for 
a decent graphical experience, while being completely mediocre and unplayable 
on the input side.

As for your last point, Critical features for this use-case vendors have to 
offer, and soon”, we completely agree and would love to see those features 
implemented sooner than later.

-- 
WebGL guru @Artillery
Mail: thib...@artillery.com
Tweet: @BKcore
From: Brendan Eich Brendan Eich
Reply: Brendan Eich bren...@secure.meer.net
Date: February 24, 2014 at 9:47:24 AM
To: Glenn Maynard gl...@zewt.org
Subject:  Re: [fullscreen] Problems with mouse-edge scrolling and games  
Glenn Maynard wrote:  
 It's not the application's job to keep the mouse cursor responsive,  
 it's the system's. Hiding the system mouse cursor and drawing one  
 manually is always a bad idea.  

Agreed!  

In the same vein, programmers cannot avoid GC pauses without relying on  
pause-free or at least incremental GC (which BTW some browsers' JS  
engines have already, e.g., SpiderMonkey in Firefox), or as a real  
alternative, cross-compiling C or C++ for example via Emscripten, to  
allocate heap memory from a typed array.  

Florian, your goals are good, but the means to those ends must involve  
better runtimes or compilers -- not on JS programmers working harder to  
avoid GC while still somehow allocating objects frequently and even  
implicitly.  

/be  


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 6:47 PM, Brendan Eich bren...@secure.meer.netwrote:

 Glenn Maynard wrote:

 It's not the application's job to keep the mouse cursor responsive, it's
 the system's.  Hiding the system mouse cursor and drawing one manually is
 always a bad idea.


 Agreed!


Like I say, some usecases are fine with OS cursors. But that doesn't mean
that somehow, vendors are absolved from improving input - output latency
issues even if pointerlock is updated to allow OS cursor showing, which I'm
all for.  There are a lot of usecases that involve pointing devices, and
pointing metaphors, or view controls, virtual helmets, and so forth, that
cannot properly function with a high input - output latency. For this
reason it's imperative not only to address the ability to make the OS
cursor visible, but also to continue working on low latency input - output.


 In the same vein, programmers cannot avoid GC pauses without relying on
 pause-free or at least incremental GC (which BTW some browsers' JS engines
 have already, e.g., SpiderMonkey in Firefox), or as a real alternative,
 cross-compiling C or C++ for example via Emscripten, to allocate heap
 memory from a typed array.

Florian, your goals are good, but the means to those ends must involve
 better runtimes or compilers -- not on JS programmers working harder to
 avoid GC while still somehow allocating objects frequently and even
 implicitly.


I agree that things aren't today how they should be for realtime
applications with GCs. And it's true that GCs are getting better. But, it
is the status of today, that a JS programmer has to work harder to make a
glitch/stutter/jerk free realtime applications. A better GC can improve
this situation. However, that doesn't mean that you can forget about GCing
and frame budgets. A realtime programmer will always have to be conscious
not to overload the GC even if it's incremental. Because when the
incremental GC would not manage to get rid of the garbage faster than it is
produced, it would have to resort to more drastic pauses to rectify that
situation. Fortunately the act of being GC conscious for a non incremental
GC, and for an incremental one, is very similar. You try to avoid
triggering it. So in that, you can start that work today, it will not be in
vain once GCs get better in some far flung future.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 7:07 PM, Vincent Scheib sch...@google.com wrote:

 Windows has ClipCursor() and Linux has XGrabPointer(). Once we know we can
 implement the functionality, we can discuss how to express this in an API.


Would using Quarz CGWarpMouseCursorPosition work where you'd clamp the
passed position into the desired rectangle?

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html#//apple_ref/c/func/CGWarpMouseCursorPosition


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Vincent Scheib
On Mon, Feb 24, 2014 at 10:37 AM, Florian Bösch pya...@gmail.com wrote:

 On Mon, Feb 24, 2014 at 7:07 PM, Vincent Scheib sch...@google.com wrote:

 Windows has ClipCursor() and Linux has XGrabPointer(). Once we know we
 can implement the functionality, we can discuss how to express this in an
 API.


 Would using Quarz CGWarpMouseCursorPosition work where you'd clamp the
 passed position into the desired rectangle?


 https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html#//apple_ref/c/func/CGWarpMouseCursorPosition



I believe no, because it would allow the pointer to escape the region
before being warped back, permitting escape if clicked at that time as well.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
Right, so you'd CGAssociateMouseAndCursorPosition(false) and then use
CGWarpMouseCursorPosition or CGDisplayMouseCursorToPoint to move it where
you want it to be, but clamped inside the rect. As long as you keep pumping
the event loop separately that does this (as fast as possible) it shouldn't
be perceptively different from an OS cursor.


On Mon, Feb 24, 2014 at 7:41 PM, Vincent Scheib sch...@google.com wrote:




 On Mon, Feb 24, 2014 at 10:37 AM, Florian Bösch pya...@gmail.com wrote:

 On Mon, Feb 24, 2014 at 7:07 PM, Vincent Scheib sch...@google.comwrote:

 Windows has ClipCursor() and Linux has XGrabPointer(). Once we know we
 can implement the functionality, we can discuss how to express this in an
 API.


 Would using Quarz CGWarpMouseCursorPosition work where you'd clamp the
 passed position into the desired rectangle?


 https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html#//apple_ref/c/func/CGWarpMouseCursorPosition



 I believe no, because it would allow the pointer to escape the region
 before being warped back, permitting escape if clicked at that time as well.



Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Glenn Maynard
On Mon, Feb 24, 2014 at 12:19 PM, Florian Bösch pya...@gmail.com wrote:

 Like I say, some usecases are fine with OS cursors. But that doesn't mean
 that somehow, vendors are absolved from improving input - output latency
 issues even if pointerlock is updated to allow OS cursor showing, which I'm
 all for.


Only if low latency is important to the application.  It's very important
for some games (rhythm games), moderately important for some (first-person
games controlled with a mouse, which in turn is more sensitive than with a
gamepad), and not very important at all for others (turn-based strategy).
 How much time to spend on this is a business decision, since this can be
very time-consuming and can require visual tradeoffs.

 There are a lot of usecases that involve pointing devices, and pointing
 metaphors, or view controls, virtual helmets, and so forth, that cannot
 properly function with a high input - output latency.

For this reason it's imperative not only to address the ability to make the
 OS cursor visible, but also to continue working on low latency input -
 output.


True, but tangental.  :)  (My last job was making music rhythm games, which
are more sensitive to consistent framerates than any other game genre I
know of--one dropped frame can wreck someone's game--so I'm sympathetic to
the cause.)

On Fri, Feb 21, 2014 at 7:00 PM, Ian Langworth i...@artillery.com wrote:

 The better option is to go fullscreen with the Fullscreen API, but this
 has problems as well. There are certain behaviors that occur when moving
 the cursor to the top and bottom of the screen,


I think that going fullscreen is the right approach, since locking the
mouse into the window while not fullscreen is really weird and rare, at
least in Windows.  By going fullscreen, this hooks into the same UI design
to allow the user to escape.  Even if this was supported in a window,
there'd still have to be some UI to tell the user how to exit, which could
end up having the same problem.

I've been annoyed by the edge-of-screen browser behavior too.  It's a part
of the screen where you might want to put something, like navigation UI.  I
haven't come up with a better solution, though.  I don't think having a
stronger fullscreen mode that asks the user for more permission will fly.
 Browsers try very hard to avoid asking for special permissions--people
will just agree without reading it, then won't know how to escape from the
app.

I think that for your use case of edge scrolling, having a fullscreen
notice appear at the top is OK (if a little ugly), as long as it's
transparent to mouse events so you can still see the mouse moving around
(or else you might see the mouse move to 20 pixels from the top, then never
see it actually reach the top, so you'd never start scrolling).  Menus and
address bars appearing seems like a bug.  That makes sense for the
fullscreen you get by hitting F11 in Windows or Command-Shift-F in OSX, but
application fullscreen should just act like a game, and keep as much as
possible out of the way.

-- 
Glenn Maynard


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Florian Bösch
On Mon, Feb 24, 2014 at 8:21 PM, Glenn Maynard gl...@zewt.org wrote:

 I think that going fullscreen is the right approach, since locking the
 mouse into the window while not fullscreen is really weird and rare, at
 least in Windows.

It's quite common for games to have a cursor, grab the pointer and not be
fullscreen. Of course most games that allow for this, use software cursors,
and are apparently not having much problems with it.


  By going fullscreen, this hooks into the same UI design to allow the user
 to escape.  Even if this was supported in a window, there'd still have to
 be some UI to tell the user how to exit, which could end up having the same
 problem.

A sidenote, if you have more than one monitor, going fullscreen will not
lock the pointer on screen, obviously. It's not terribly common perhaps to
have more than one monitor, but it's also not that rare.


I've been annoyed by the edge-of-screen browser behavior too.  It's a part
 of the screen where you might want to put something, like navigation UI.  I
 haven't come up with a better solution, though.  I don't think having a
 stronger fullscreen mode that asks the user for more permission will fly.
  Browsers try very hard to avoid asking for special permissions--people
 will just agree without reading it, then won't know how to escape from the
 app.

 I think that for your use case of edge scrolling, having a fullscreen
 notice appear at the top is OK (if a little ugly), as long as it's
 transparent to mouse events so you can still see the mouse moving around
 (or else you might see the mouse move to 20 pixels from the top, then never
 see it actually reach the top, so you'd never start scrolling).  Menus and
 address bars appearing seems like a bug.  That makes sense for the
 fullscreen you get by hitting F11 in Windows or Command-Shift-F in OSX, but
 application fullscreen should just act like a game, and keep as much as
 possible out of the way.


For a fast paced game where you might click and select and do whatnot,
having a slidedown from the top of the window when you hit the border is
not acceptable. People will click it accidentally a lot for instance when
doing a selection. Not being able to offer a fullscreen button in the game
is also bad UX. You end up with explanations for the user to Please press
F11 to get into fullscreen. You should never have to explain to a user
what ritual he has to perform, if instead you can trigger that action
without the ritual.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-24 Thread Thibaut Despoulain
Exactly. Having an “exit from fullscreen” bar or some OS auto-hide elements 
like docks and task bars popping up  at the edges when you play an intense 
twitch game is simply horrendous. We have several playtests feedbacks arguing 
in that direction.

Not to mention that a lot of our alpha players have multi-monitors 
configurations where the mouse is “escaping” on the secondary monitor, even 
while full screened, which is a terrible experience.

-- 
WebGL guru @Artillery
Mail: thib...@artillery.com
Tweet: @BKcore
From: Florian Bösch Florian Bösch
Reply: Florian Bösch pya...@gmail.com
Date: February 24, 2014 at 11:32:13 AM
To: Glenn Maynard gl...@zewt.org
Subject:  Re: [fullscreen] Problems with mouse-edge scrolling and games  
On Mon, Feb 24, 2014 at 8:21 PM, Glenn Maynard gl...@zewt.org wrote:
I think that going fullscreen is the right approach, since locking the mouse 
into the window while not fullscreen is really weird and rare, at least in 
Windows.
It's quite common for games to have a cursor, grab the pointer and not be 
fullscreen. Of course most games that allow for this, use software cursors, and 
are apparently not having much problems with it.
 
 By going fullscreen, this hooks into the same UI design to allow the user to 
escape.  Even if this was supported in a window, there'd still have to be 
some UI to tell the user how to exit, which could end up having the same 
problem.
A sidenote, if you have more than one monitor, going fullscreen will not lock 
the pointer on screen, obviously. It's not terribly common perhaps to have more 
than one monitor, but it's also not that rare.
 

I've been annoyed by the edge-of-screen browser behavior too.  It's a part of 
the screen where you might want to put something, like navigation UI.  I 
haven't come up with a better solution, though.  I don't think having a 
stronger fullscreen mode that asks the user for more permission will fly.  
Browsers try very hard to avoid asking for special permissions--people will 
just agree without reading it, then won't know how to escape from the app.

I think that for your use case of edge scrolling, having a fullscreen notice 
appear at the top is OK (if a little ugly), as long as it's transparent to 
mouse events so you can still see the mouse moving around (or else you might 
see the mouse move to 20 pixels from the top, then never see it actually reach 
the top, so you'd never start scrolling).  Menus and address bars appearing 
seems like a bug.  That makes sense for the fullscreen you get by hitting F11 
in Windows or Command-Shift-F in OSX, but application fullscreen should just 
act like a game, and keep as much as possible out of the way.

For a fast paced game where you might click and select and do whatnot, having a 
slidedown from the top of the window when you hit the border is not acceptable. 
People will click it accidentally a lot for instance when doing a selection. 
Not being able to offer a fullscreen button in the game is also bad UX. You end 
up with explanations for the user to Please press F11 to get into fullscreen. 
You should never have to explain to a user what ritual he has to perform, if 
instead you can trigger that action without the ritual.




Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-23 Thread Florian Bösch
On Sun, Feb 23, 2014 at 1:57 AM, Thibaut Despoulain thib...@artillery.com
 wrote:

 The issue with pointerlock is that it requires the app to draw its own
 cursor instead of the OS cursor

I fully agree with motivation, it is usually preferrable to give the user
an OS-themed cursor (not always, but often).


- Significant pointer lag between movement input and actual movement
on screen compared to an OS-drawn cursor (yes, even at 60fps),

 I've written a test for this here:
http://codeflow.org/issues/software-cursor.html

My observation from testing on linux is that I can't distinguish latency
for the software cursor from the OS cursor (or not by much anyway) in
google chrome. In firefox however there's noticable lag. Mileage may vary
for other platforms.



- Inability to use DOM elements with mouse events for a game
overlay/HUD.

 The test I've written here 
 http://codeflow.org/issues/software-cursor.htmlalso tests mouse event 
 synthesis (as hinted at by an example in the
pointerlock spec) and it works satisfactory in chrome and firefox on linux.
To get all subtleties right one would also have to do most other mouse
events I guess (mouseover, mouseout, mousemove etc.).


On Sun, Feb 23, 2014 at 2:15 AM, Brandon Jones bajo...@google.com wrote:

 Chrome a software cursor will experience visible lag, which these types of
 games are highly sensitive to.

Not as much lag as I expected, see this test:
http://codeflow.org/issues/software-cursor.html


 I'm not sure about the latency of Firefox or others

Pretty bad, see this test: http://codeflow.org/issues/software-cursor.html



 , but in general a hardware cursor is preferable any time you have a
 visible cursor. As a result this is still a use case worth considering.

It's not always preferrable (sometimes people want custom cursors). But in
general it is preferrable.


When providing the OS cursor there's several issues to be addressed:

   - If you are in fullscreen, capture the cursor to the viewport but show
   the OS cursor, that does *NOT* mean you'll want the annoying slide-down
   that some browsers provide if you hit the top edge. If you wanted that,
   you'd never have restricted the cursor in the first place. I would suggest
   as a resolution that if somebody requests cursor restriction, and gets it,
   that the slide down is never shown regardless if the OS cursor is shown or
   not.
   - It should be possible to show and hide the OS cursor separately, but
   retain pointerlock. The reason for that is that you might want to avoid
   synthesizing your own cursor, but you may also want to keep pointerlock
   because your game switched to some UI interaction for instance from an FPS
   interaction mode. I would suggest this could be resolved with an additional
   API call of the form: document.hideCursor() and document.showCursor() or
   something similar. If the sequence is myContainer.requestPointerLock();
   document.showCursor(); the cursor is shown, but confined to the container.
   Outside of being in pointerlock, these calls would have no effect.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-23 Thread Florian Bösch
On Sun, Feb 23, 2014 at 9:55 AM, Florian Bösch pya...@gmail.com wrote:


- Inability to use DOM elements with mouse events for a game
overlay/HUD.

 The test I've written here
 http://codeflow.org/issues/software-cursor.html also tests mouse event
 synthesis (as hinted at by an example in the pointerlock spec) and it works
 satisfactory in chrome and firefox on linux. To get all subtleties right
 one would also have to do most other mouse events I guess (mouseover,
 mouseout, mousemove etc.).


I did some more testing on this. Synthetic mouse events are limited in that
they cannot trigger some state like hover styles. Other things like
focus/blur require special handling. It's also left to the synthetic event
creator to synthesize compound events like over/out/enter/leave and their
semantic as supplying the primitive mouse events (click, mousemove) doesn't
automatically synthesize the others.


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-23 Thread Brandon Jones
Several points to add:

- it's possible to theme the OS cursor using custom images with CSS.
https://developer.mozilla.org/en-US/docs/Web/CSS/cursor/url
- The reason the cursor is hidden when the pointer is locked is that some
OSes don't have the ability to report relative mouse movement correctly at
screen edges. This requires the cursors to constantly be reset to the
center of the screen, which obviously would look strange if the cursor was
visible.
- You already mentioned some issues with synthetic mouse events, but
unfortunately it's worse than you suspect. For example: sending a synthetic
click event to a checkbox doesn't actually change it's checked state. (Not
the last time I tried anyway) select controls also have a hard time with
synthetic events, and there's a whole host of other sub rely broken things.
:(

Thanks for the tests!

On Sunday, February 23, 2014, Florian Bösch pya...@gmail.com wrote:

 On Sun, Feb 23, 2014 at 9:55 AM, Florian Bösch 
 pya...@gmail.comjavascript:_e(%7B%7D,'cvml','pya...@gmail.com');
  wrote:


- Inability to use DOM elements with mouse events for a game
overlay/HUD.

 The test I've written here
 http://codeflow.org/issues/software-cursor.html also tests mouse event
 synthesis (as hinted at by an example in the pointerlock spec) and it works
 satisfactory in chrome and firefox on linux. To get all subtleties right
 one would also have to do most other mouse events I guess (mouseover,
 mouseout, mousemove etc.).


 I did some more testing on this. Synthetic mouse events are limited in
 that they cannot trigger some state like hover styles. Other things like
 focus/blur require special handling. It's also left to the synthetic event
 creator to synthesize compound events like over/out/enter/leave and their
 semantic as supplying the primitive mouse events (click, mousemove) doesn't
 automatically synthesize the others.



Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-23 Thread Florian Bösch
On Sun, Feb 23, 2014 at 4:18 PM, Brandon Jones bajo...@google.com wrote:

 - it's possible to theme the OS cursor using custom images with CSS.
 https://developer.mozilla.org/en-US/docs/Web/CSS/cursor/url

Although that doesn't absolve vendors from fixing the latency issue even if
native pointers where to be made available during pointerlock. The reason
is that cursors come in more flavors than an image. For example they could
come in some variety of 3D rendered representations useful for the game in
question.


 - The reason the cursor is hidden when the pointer is locked is that some
 OSes don't have the ability to report relative mouse movement correctly at
 screen edges. This requires the cursors to constantly be reset to the
 center of the screen, which obviously would look strange if the cursor was
 visible.

Isn't that only a concern if you want to capture the cursor, not when you
display the OS cursor?


 - You already mentioned some issues with synthetic mouse events, but
 unfortunately it's worse than you suspect. For example: sending a synthetic
 click event to a checkbox doesn't actually change it's checked state. (Not
 the last time I tried anyway) select controls also have a hard time with
 synthetic events, and there's a whole host of other sub rely broken things.
 :(

Is there a motivation not to make it work? Clickjacking?


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-22 Thread Florian Bösch
On Sat, Feb 22, 2014 at 11:22 PM, Florian Bösch pya...@gmail.com wrote:

 Caveat, I think Firefoxes implementaiton of the Pointerlock API might not
 follow the specification yet to make it possible to have pointerlock
 without fullscreen.


Just checked this against a test I wrote a while ago
http://codeflow.org/issues/pointerlock-test.html and consulted the
pointerlock stats for IE. You can get pointerlock in both firefox and
chrome without fullscreen (you can also get pointerlock and fullscreen
simultaneously). IE seems to support pointerlock in versions that have
webgl, but they seem to have added it only recently so support is still low
(32%).


Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-22 Thread Florian Bösch
Pointerlock should solve these problems in the following fashion:

   - When the user clicks into the app, request pointerlock
   - Use it to give him a cursor drawn by you
   - That way you can keep the interaction inside your game and accurately
   detect borders etc.

I run http://webglstats.com/ and It also records the availability of
pointerlock. This is relative to everybody who has webgl and it currently
stands at 94.1%.

Caveat, I think Firefoxes implementaiton of the Pointerlock API might not
follow the specification yet to make it possible to have pointerlock
without fullscreen. I know that it's possible to get pointerlock in google
chrome without fullscreen.

Links:

   - http://www.html5rocks.com/en/tutorials/pointerlock/intro/
   - http://www.w3.org/TR/pointerlock/




On Sat, Feb 22, 2014 at 2:00 AM, Ian Langworth i...@artillery.com wrote:

 Hi everyone,

 We're building a console- and native-quality game in the browser using
 JavaScript and WebGL. You can see a very early version of the game in this
 video: https://youtu.be/NiCy5igO9-I . It's a realtime strategy (RTS)
 game, like StarCraft[1] or Command  Conquer[2], and moving the cursor to
 the edge of the screen is the primary way that users move around the map.

 We have a single requirement: Moving the cursor to, and possibly past, the
 edge of the window or screen should pan the camera in that direction.

 In windowed mode there are a couple of problems: Players might click
 outside the window accidentally, pixels outside the window are wasted
 screen real estate, mousemove events aren't fired when the cursor is
 outside the window, and sometimes the cursor moves so quickly that it
 misses the area of the window where we do edge detection.

 The better option is to go fullscreen with the Fullscreen API, but this
 has problems as well. There are certain behaviors that occur when moving
 the cursor to the top and bottom of the screen, which I've illustrated in
 the following videos using a quick edge-scrolling demo[3].. (Please ignore
 the problems with cursor detection in the Windows videos. It only occurred
 while the screen recording software was active.):

Chrome, Windows 7
https://www.dropbox.com/s/t9kyo8s5am76ezg/chrome%20win7%20edges.avi
The fullscreen notice appears every time the cursor is moved to the top.

Chrome, Mac OS X
https://www.dropbox.com/s/ke1mr5te2dwgvor/chrome%20osx%20edges.mov
A poor experience with the menu and address bars appearing at the top
 and Dock appearing at the bottom.

Firefox, Windows 7

 https://www.dropbox.com/s/iku8croaphsgcwd/firefox%20win7%20edges.avihttps://www.dropbox.com/s/iku8croaphsgcwd/firefox%20win7%20edges..avi
No problems with the fullscreen experience!

Firefox, Mac OS X
https://www.dropbox.com/s/0bkdx71ir0yhw88/firefox%20osx%20edges.mov
Menu bar appears at top, along with some mysterious window chrome, and
 the Dock appears at the bottom as well.

 These behaviors are to remind the user about fullscreen and lessen the
 chance of phishing. But, as you might imagine, they are troublesome when
 you're in the heat of battle and are trying to crush your opponent. I would
 like to solicit the list for opinions on how we can improve the fullscreen
 UI for games and give players the best experience possible. Some options
 that come to mind:

   (A) Provide an alternate fullscreen API or option which provides a more
 complete experience, but with more dire warnings to the user. For example,
 pass in a flag to requestFullscreen() which gives the page full control
 over the screen (no fullscreen reminder notifications, menu bars, or Docks)
 and even the keyboard (so games can use the Escape key), but entering this
 mode presents a much more intense warning to the user like the invalid
 certificate warnings.

   (B) Maintain the current API, but put an option in the preferences or
 flags which makes the browser's fullscreen mode more complete and without
 interruption. Hardcore gamers will likely accept this extra step if it
 means getting an optimal experience.

   (C) Propose a new Mouse-Edge Detection API, which might solve these
 problems and provide games with better cursor detection overall.

 I appreciate any and all feedback.

 [1] http://youtu.be/Qb0VzbxdP4U?t=10m14s

 [2] http://youtu.be/l41hG-fVDN4?t=3m34s

 [3] http://jsfiddle.net/statico/F8sjw/show/




Re: [fullscreen] Problems with mouse-edge scrolling and games

2014-02-22 Thread Brandon Jones
Pointer lock does indeed provide a workaround for this, but it's worth
noting that with the current architecture of Chrome a software cursor will
experience visible lag, which these types of games are highly sensitive to.
I'm not sure about the latency of Firefox or others, but in general a
hardware cursor is preferable any time you have a visible cursor. As a
result this is still a use case worth considering.

--Brandon

On Saturday, February 22, 2014, Florian Bösch pya...@gmail.com wrote:

 Pointerlock should solve these problems in the following fashion:

- When the user clicks into the app, request pointerlock
- Use it to give him a cursor drawn by you
- That way you can keep the interaction inside your game and
accurately detect borders etc.

 I run http://webglstats.com/ and It also records the availability of
 pointerlock. This is relative to everybody who has webgl and it currently
 stands at 94.1%.

 Caveat, I think Firefoxes implementaiton of the Pointerlock API might not
 follow the specification yet to make it possible to have pointerlock
 without fullscreen. I know that it's possible to get pointerlock in google
 chrome without fullscreen.

 Links:

- http://www.html5rocks.com/en/tutorials/pointerlock/intro/
- http://www.w3.org/TR/pointerlock/




 On Sat, Feb 22, 2014 at 2:00 AM, Ian Langworth 
 i...@artillery.comjavascript:_e(%7B%7D,'cvml','i...@artillery.com');
  wrote:

 Hi everyone,

 We're building a console- and native-quality game in the browser using
 JavaScript and WebGL. You can see a very early version of the game in this
 video: https://youtu.be/NiCy5igO9-I . It's a realtime strategy (RTS)
 game, like StarCraft[1] or Command  Conquer[2], and moving the cursor to
 the edge of the screen is the primary way that users move around the map.

 We have a single requirement: Moving the cursor to, and possibly past,
 the edge of the window or screen should pan the camera in that direction.

 In windowed mode there are a couple of problems: Players might click
 outside the window accidentally, pixels outside the window are wasted
 screen real estate, mousemove events aren't fired when the cursor is
 outside the window, and sometimes the cursor moves so quickly that it
 misses the area of the window where we do edge detection.

 The better option is to go fullscreen with the Fullscreen API, but this
 has problems as well. There are certain behaviors that occur when moving
 the cursor to the top and bottom of the screen, which I've illustrated in
 the following videos using a quick edge-scrolling demo[3].. (Please ignore
 the problems with cursor detection in the Windows videos. It only occurred
 while the screen recording software was active.):

Chrome, Windows 7
https://www.dropbox.com/s/t9kyo8s5am76ezg/chrome%20win7%20edges.avi
The fullscreen notice appears every time the cursor is moved to the
 top.

Chrome, Mac OS X
https://www.dropbox.com/s/ke1mr5te2dwgvor/chrome%20osx%20edges.mov
A poor experience with the menu and address bars appearing at the top
 and Dock appearing at the bottom.

Firefox, Windows 7

 https://www.dropbox.com/s/iku8croaphsgcwd/firefox%20win7%20edges.avihttps://www.dropbox.com/s/iku8croaphsgcwd/firefox%20win7%20edges..avi
No problems with the fullscreen experience!

Firefox, Mac OS X
https://www.dropbox.com/s/0bkdx71ir0yhw88/firefox%20osx%20edges.mov
Menu bar appears at top, along with some mysterious window chrome, and
 the Dock appears at the bottom as well.

 These behaviors are to remind the user about fullscreen and lessen the
 chance of phishing. But, as you might imagine, they are troublesome when
 you're in the heat of battle and are trying to crush your opponent. I would
 like to solicit the list for opinions on how we can improve the fullscreen
 UI for games and give players the best experience possible. Some options
 that come to mind:

   (A) Provide an alternate fullscreen API or option which provides a more
 complete experience, but with more dire warnings to the user. For example,
 pass in a flag to requestFullscreen() which gives the page full control
 over the screen (no fullscreen reminder notifications, menu bars, or Docks)
 and even the keyboard (so games can use the Escape key), but entering this
 mode presents a much more intense warning to the user like the invalid
 certificate warnings.

   (B) Maintain the current API, but put an option in the preferences or
 flags which makes the browser's fullscreen mode more complete and without
 interruption. Hardcore gamers will likely accept this extra step if it
 means getting an optimal experience.

   (C) Propose a new Mouse-Edge Detection API, which might solve these
 problems and provide games with better cursor detection overall.

 I appreciate any and all feedback.

 [1] http://youtu.be/Qb0VzbxdP4U?t=10m14s

 [2] http://youtu.be/l41hG-fVDN4?t=3m34s

 [3] http://jsfiddle.net/statico/F8sjw/show/