Tuesday, November 24, 2015

Why other forms of mouse acceleration are bad

As I said in the introduction to this blog, other acceleration options are notoriously bad.  I'm going to break down why, but I want to preface all of this with the statement that povohat's mouse accel driver has none of the listed issues if you are using it correctly.

Games with mouse acceleration forced on never provide a good experience since you always need to tweak the variables of mouse acceleration depending on your mouse's USB refresh rate (125hz feels vastly different to 1000hz with accel), your mouse's DPI, in game sensitivity, and so on.  Furthermore, a lot of games only check how far the mouse moved just before it draws a new frame.  So if you get into a low framerate area during a heavy battle, you might be moving your mouse at a static speed but find that suddenly it's turning twice as fast as normal!  That's unbearably terrible - your frame rate should never destroy your ability to predict where you will be aiming when you move your mouse.

So, either a game needs to check for mouse input between frames (Reflex, for example is implementing 1000hz input scanning regardless of game FPS to maintain consistency), or you need a driver to handle the acceleration calculations.

But as most know, plenty of mouse drivers still do very poorly with accel.  The most well known is Windows' "Enhance Pointer Precision."  What does it actually do?  It's what we call "threshold based accel."  Basically, if you are moving your mouse slow enough, it acts like a flat mouse sensitivity with no acceleration.  Once you pass a certain speed of moving your mouse, your sensitivity suddenly doubles.  The curve of mouse sensitivity vs mouse speed would look something like this (vertical axis is effective mouse sensitivity where a flat line means no accel):

In theory, it isn't a bad idea - If you're tracking someone at a long range, you can use low sensitivity, and you can get a nice flick in close range to reorient yourself and still stay in the fight.  The problem occurs when you are trying to fight someone at a medium range.  You might be tracking your opponent and keeping up just fine, then suddenly he gets close enough that your tracking sensitivity doubled.  Ew.  That just throws people off, and there's a good reason every FPS community out there will tell you to turn it off.

edit: Per Mark Cranness in the comments of this post, this form of acceleration hasn't been used in Windows for a number of years.  The modern "enhance pointer precision" curve apparently looks like this.  It's definitely better than a lot of bad accel options out there, but configuring it is quite difficult compared to povohat's driver! :)

Next up: Logitech mouse acceleration.  Full disclosure, I haven't used Logitech's driver mouse accel since probably 2001, but this is what the curve looked like back then:

It starts out low and then begins raising as a parabola.  y=x^2 style accel.  The problem with this mouse acceleration is that as you move the mouse faster, it becomes completely uncontrollable.  It's also rather difficult (but not impossible) to get muscle memory working for flicks since the difference in sensitivity becomes very large.  Logitech's accel options of "low," "medium," and "high," controlled how quickly the accel would raise, but it was always uselessly fast when you flicked.

So, what did Quake 3's mouse accel option look like?  Linear, like this:

So now, what we've got is a mouse acceleration that grants you the ability to track at low speeds, a gradual/predictable increase in sensitivity, and a sane sensitivity at the high end.  Quake 3's console variable let you specify exactly how much you wanted (the slope of the line), so you could fit it to your preferences.  If you changed to a different mouse with a different DPI, you can tweak the curve exactly as you wanted to.  This is why pro players in Quake 3 started using mouse acceleration - you get the benefits of low sensitivity (great long range tracking) and high sensitivity (you won't lose your target in close range).

Finally, how I'd like to show how I'm using mouse acceleration:

So, I've got linear mouse acceleration going on, which has some great benefits.  What is new is that I have a "sensitivity cap" where suddenly acceleration stops happening.  The most amazing part about that sensitivity cap is that my muscle memory for flicks will work perfectly.  I know how much mousepad it takes to do a 180, and I can perform it on command.  Even better - if I change to playing a game where there are more long range fights, I can drop my base sensitivity but have it cap out at the same top level, and I can still do my 180 flicks by muscle memory!


  1. Threshold based accel was used in Windows 2000 and prior.
    'Enhance pointer precision' based accel was introduced in XP and uses a smoothly varying curve based on 4 points (5 if you count the first zero point).
    The sensitivity curve for Windows 8+10 looks like this:
    Image @ google drive
    (Note: mouse movement scale from 0 to 75 is perhaps not the best scale, but matches your other images.)

    1. Thank you for the correction. This definitely shows how old I am, right? :P

    2. How would i emulate the XP Enhanced Pointer precision? Please contact me Mark/Kovaak or anyone who will know, i am happy to comission somebody to figure this out for me, hell i've lost enough hours trying

  2. I would like to copy the mouse acceleration from microsoft 8- 10 in to the program, anyone have the numbers?

    1. I strongly suspect povohat's mouse driver can't directly understand the Windows curve, because it uses a very different method of calculating accel : thresholds and exponents and such, rather than a curve lookup.

      It might be possible to approximate the Windows curve, or it might be very difficult or impossible, I don't know which...