我们先略过鼠标引擎对信号的处理,只考虑软件方面。鼠标CPI全称counts per inch,每英寸测量数,一般容易误称为DPI,也就是dots per inch,每英寸点数,点代表屏幕上的点,即像素。只有当鼠标报告的单位移动导致指针在屏幕上移动正好一像素时,DPI才等于CPI。此时鼠标移动与指针移动之间的关系称为“精确一比一”。比如DPI最常用的为400,此时单位移动距离为1/400英寸,当鼠标移动1/400英寸时,鼠标向系统报告一个单位移动。如果设置为精确一比一,那么指针将精确地移动一个像素。
XP和Vista在启用EPP时会根据显示器分辨率和刷新率调整鼠标速度,内部计算中包括一项“*RefreshUpdateRate/SCreenResolution”,即乘以显示器刷新率除以分辨率。所以更高的刷新率、更低的分辨率会导致更快的鼠标速度。首先,XP和Vista假定鼠标位置在显示器每次刷新的时候同时得到更新,但事实上,鼠标位置是由USB总线报告的每次信号更新的,与显示器刷新率并不同步。正确的公式应为
在话题进入去加速之前,我们先谈一下所谓的负加速。对于包括CS在内的使用WM_MOUSEMOVE或GetCursorPos读取鼠标移动的游戏,鼠标被锁定在屏幕中心。游戏在每一帧过后都会不断重置鼠标的位置到屏幕中心,这是为了避免指针移动到屏幕边缘被挡住无法移动。当鼠标移动时游戏中隐藏的鼠标指针随之移动,在每一帧内,游戏计算出指针从屏幕中心移开的距离作为玩家准星的移动距离,然后将鼠标重置到屏幕中心。下一帧再重复相同步骤,以此往复。只有当控制台被调出时游戏才不会重置鼠标到屏幕中心。
假设控制面板设置为9/11,鼠标移动1个单位,经过运算1*2.5=2.5,指针移动2像素;下一次USB回报时报告鼠标再移动1个单位,经过运算1*2.5=2.5,与上次移动余数相加为3,这时指针移动3个像素。这样一来,同样的鼠标移动,在屏幕上却会导致不同的指针移动。而且,即便鼠标以最小单位逐步移动,屏幕上仍有某些像素一定会被跳过,无法用指针精确定位到。此时定位的不准确是由于倍乘系数>1,导致精密定位的困难。
如果用户没有管理员权限,系统会显示部分补丁内容导入失败,这是由于补丁的一部分内容将Windows欢迎屏幕的加速关闭。如果这部分内容导入失败,而用户又使用欢迎屏幕登录系统的话,欢迎屏幕的加速度会使未完全导入的补丁产生误差,鼠标变向时将产生每鼠标单位移动1个像素的误差。1像素的微小误差一般很难注意到,但如果要修复这一问题,有以下几个方法可以任选其一使用:
CS的去加速参数
分析了所有注册表补丁后,我们讨论一下CS的去加速启动参数。先来看一段Goldsource引擎(HL,CS)的源代码:
===========
IN_StartupMouse
===========
*/
void IN_StartupMouse (void)
{
if ( gEngfuncs.CheckParm ('-nomouse', NULL ) )
return;
mouseinitialized = 1;
mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0);
if (mouseparmsvalid)
{