分享

Windows7系统高阶鼠标调试详解

 gogo798fd 2018-12-28
1基本概念:无加速度与精确一比一回顶部
(太平洋游戏网·givoLtaqe | 转载请注明出处和作者)
  实话说,写本文的直接诱因是e-Stars后Savage说不会调试Win7系统,笔者做为一名使用Win7超过两年半的普通玩家非常震惊。CS心得技巧依靠论坛发帖、群组讨论、玩家口口相传能普及吗?在大时间尺度上或许可以广泛传播,或许对于提供各种配置环境下的测试结果行之有效,但并不利于谣言的辟除和新技巧的推广,与国际接轨、与顶尖职业选手接轨,我们还差得很远。去中心化是CS作为一个经久不衰的电竞项目的优势,但中心化的媒体仍然能够在其推动上发挥枢纽作用。
本文所提到的软件合集打包下载:附件
TyLoo @ e-Stars
TyLoo @ e-Stars 2011
  实际上,要写篇文章介绍一个正确的调机器技巧很简单,但难的是搞清楚问题出在哪里,不同的方法是基于什么原理,有何影响,有何区别,进而澄清常见的误区。本文将跳过基本常识,以各个Windows版本下的鼠标调试作为主要内容,包含OS、API、驱动、游戏引擎、各种去除加速方法的分析,辅以Win7其他方面的调试技巧。
  基本概念:无加速度与精确一比一
  地球人都知道控制面板中的“Enhance pointer precision”(提高指针精准度,下文简称EPP)是开启鼠标加速的选项。由于在电竞、作图等领域需要对鼠标的精确控制,高阶用户都习惯关闭EPP。
EPP
每个人都会更改鼠标设置,又有几个人了解它?
  加速是个老生常谈、经久不衰的话题,但鼠标设置不仅有加速度这一个方面。假设加速已经完全去除,那么手握鼠标的移动应与屏幕上指针移动呈一次线性关系,但这样就能保证鼠标移动的精确了吗?答案当然是否定的。
  我们先略过鼠标引擎对信号的处理,只考虑软件方面。鼠标CPI全称counts per inch,每英寸测量数,一般容易误称为DPI,也就是dots per inch,每英寸点数,点代表屏幕上的点,即像素。只有当鼠标报告的单位移动导致指针在屏幕上移动正好一像素时,DPI才等于CPI。此时鼠标移动与指针移动之间的关系称为“精确一比一”。比如DPI最常用的为400,此时单位移动距离为1/400英寸,当鼠标移动1/400英寸时,鼠标向系统报告一个单位移动。如果设置为精确一比一,那么指针将精确地移动一个像素。
  所以理想情况下,要达到指针对于鼠标移动的精确反映,那么不仅要去除加速,精确一比一也是必要的。如果设置不是精确一比一,那么一部分小幅鼠标操作会有延迟或被舍弃。

2各版本Windows系统对鼠标行为的处理回顶部

  各版本Windows系统对鼠标行为的处理
  首先我们谈一下OS对鼠标数据的处理,也就是我们日常操作的桌面环境,游戏环境将于后文说明。
  从Windows 2000,XP,到Vista,OS对数据的处理都存在缺陷,只有在Win7中得到了修复。我们先来看一小段早期Windows版本中的代码简略版本,通过分析对比详细代码我们可以得知,早期Windows在EPP开启时对于鼠标行为的计算存在严重缺陷。
function Initialise()
....if (MouseSensitivity <= 2) MouseSensitivityFactor = MouseSensitivity / 32
....if (MouseSensitivity between 3 and 10) MouseSensitivityFactor = (MouseSensitivity - 2) / 8
....if (MouseSensitivity between 11 and 20) MouseSensitivityFactor = (MouseSensitivity - 6) / 4
....for i = 1 to 4
........EnhancedSensitivityFactor[i] = (MouseSensitivity/10) 
............* ScreenRefreshRate / SmoothMouseX[i] 
............* SmoothMouseY[i] / (ScreenDPI * 3.5)
....end-for
end-function
if (MouseSpeed = 0) then
....PointerMovement = MouseMovement * MouseSensitivityFactor
else
....i = FindSmoothMouseCurve(MouseMovement)
....PointerMovement = MouseMovement * EnhancedSensitivityFactor[i]
end-if
  1. 计算过程中对于分数的取舍导致指针抖动、漂移
  在Windows 98中(至少Win98),OS内部对于加速度、速度缩放的多重计算会导致指针的分数移动,也就是说指针移动的计算结果不一定是整数。这一计算结果被分为整数和分数余数两部分,整数由结果取整得到,分数即不足一像素的余数部分,一般与整数同号。系统内部储存分数部分,并追加到下一次指针移动计算结果上。举例来说,比如+2.7像素被分为+2和+0.7两部分,-3.3像素被分为-3和-0.3两部分。
  Windows XP有时追加前一余数,有时会舍弃前一余数,然后向负无穷方向近似结果,储存新的余数。向负无穷近似的意思是余数永远为正,比如-3.3像素被处理为-4和+0.7两部分。系统舍弃正余数会导致长时间后指针相对于鼠标在鼠标垫上的实际位置向上方漂移,还可能导致鼠标在水平或竖直方向轻微弯曲的移动反映在指针上成了完全水平或完全竖直的移动。这一效应在XP中最为明显,Vista略好一点。下图中小红点表示垫子上的鼠标实际移动,指针则表示XP的计算结果。
 XP
  Windows Vista有时叠加前一余数,有时会舍弃前一余数,然后向负无穷方向近似结果,储存新的余数。基本算法与XP一致,但Vista舍弃余数的频率比XP少得多。
  Windows 7追加前一余数,然后将非整数的结果朝零的方向取整显示,并储存新的同号余数。这是正确的处理方法。如下图所示,当缓慢转动鼠标时,指针也进行圆周运动,没有XP或Vista明显的漂移现象,指针圆周半径小于鼠标圆周半径是由于移动速度慢所致。
Win7
  2. 利用显示器DPI缩放指针速度公式错误
  从Win9x开始,微软添加了显示器DPI设置用于放大或缩小UI元素。从Windows XP开始微软将显示器DPI纳入缩放鼠标指针速度的算法中。在XP和Vista中,OS的EPP计算中对于DPI的处理是错误的。在固定鼠标和垫子的情况下,高桌面DPI导致更小的指针移动。内部计算公式包括一个除数“/DPI”。
  在Windows 7中,指针速度也是根据DPI缩放的。但在固定鼠标和垫子的情况下,高桌面DPI导致更大的指针移动。内部计算公式包括一项“*DPI”。
  3. 显示器分辨率和刷新率影响鼠标速度
  XP和Vista在启用EPP时会根据显示器分辨率和刷新率调整鼠标速度,内部计算中包括一项“*RefreshUpdateRate/ScreenResolution”,即乘以显示器刷新率除以分辨率。所以更高的刷新率、更低的分辨率会导致更快的鼠标速度。首先,XP和Vista假定鼠标位置在显示器每次刷新的时候同时得到更新,但事实上,鼠标位置是由USB总线报告的每次信号更新的,与显示器刷新率并不同步。正确的公式应为
eq1
  而微软意图使用的公式为
eq2
  其次,即便我们暂且接受微软的理论推导,但可惜的是,在实施该理论的过程中编程人员再次犯了低级错误。XP和Vista中实际使用的公式如下
eq3
  也就是说,屏幕分辨率和屏幕刷新率两项的位置颠倒了。
  为什么错误的公式如此之久后才被修复?
  比如一块普通LCD屏幕使用-freq 75,桌面分辨率为默认96DPI(Win7中的100%),普通的鼠标刷新率为125Hz。
  正确的系数为eq4
  错误的系数为eq5
  百分误差仅有eq6
  难怪微软只有到了Win7才注意到并修复了这个错误。
  Windows 7采用了正确的公式,即
eq7
  不过在此公式中,系统所采用的鼠标总线刷新率并非真实的鼠标USB回报率,而是一个固定值——150Hz。微软固定这个常数是出于如下考虑:绝大多数使用XP和Vista的低端用户设置为屏幕96DPI,屏幕刷新率60Hz,所以旧系统中系数为
eq8
  但当这些用户过渡到Win7时,为了避免使用体验上的明显差异,微软需要保持系数基本稳定,所以在Win7中需要保证新的系数公式值约为1.6
eq9
  解得鼠标总线刷新率≈153.6Hz,取整后为150Hz。因此我们可以看出,即便是在鼠标方面,Windows 7仍然是最为完善的系统,因为只有Win7使用了正确的EPP计算公式,并彻底解决了由于分数近似、取舍导致的鼠标抖动、漂移问题。

3Windows中鼠标输入数据的读取回顶部

  Windows中鼠标输入数据的读取
  Windows中应用程序共有四种方式读取鼠标输入数据:
  1. WM_MOUSEMOVE函数(大多数非游戏程序、老游戏采用,受EPP影响)
  2. GetCursorPos函数(老游戏采用,受EPP影响)
  3. DirectInput(DirectX组件,涵盖鼠标、键盘、摇杆和其他手柄,不受EPP影响)
  4. Raw Input/WM_INPUT函数(新游戏采用,不受EPP影响)
  WM_MOUSEMOVE和GetCursorPos均为通过Windows读取鼠标动作,Raw Input/WM_INPUT为直接从鼠标读取的最底层数据,DirectInput与Raw Input类似但一般用于摇杆或手柄的读取。WM_INPUT对于游戏来说是最好的方式,因为它直接读取底层鼠标数据,给予精确一比一的鼠标灵敏度,并铲除了加速度的祸根。包括CS在内的大多数老游戏都采取了第一种方法WM_MOUSEMOVE。对于采取WM_MOUSEMOVE或者GetCursorPos的程序,EPP会影响程序中的鼠标加速度。一些程序会在默认情况下自动开启EPP,一些程序不会。
  因此,如果一款游戏受Windows 加速度曲线(由注册表定义)的影响,它必须满足以下两个条件:
  1. 使用WM_MOUSEMOVE或GetCursorPOS读取鼠标输入数据,而不是Raw Input或DirectInput
  2. 程序运行时自动启用EPP
  在EPP禁用的情况下如果程序运行时自动启用EPP,那么桌面控制面板的EPP设置会被覆盖。这时需要利用补丁等手段去除加速度;反之,在EPP禁用的情况下如果程序运行时不自动启用EPP,而是尊重用户的系统设置,那么在控制面板中禁用EPP已经足以去除加速度,不需要任何补丁。
  负加速的始作俑者
  在话题进入去加速之前,我们先谈一下所谓的负加速。对于包括CS在内的使用WM_MOUSEMOVE或GetCursorPos读取鼠标移动的游戏,鼠标被锁定在屏幕中心。游戏在每一帧过后都会不断重置鼠标的位置到屏幕中心,这是为了避免指针移动到屏幕边缘被挡住无法移动。当鼠标移动时游戏中隐藏的鼠标指针随之移动,在每一帧内,游戏计算出指针从屏幕中心移开的距离作为玩家准星的移动距离,然后将鼠标重置到屏幕中心。下一帧再重复相同步骤,以此往复。只有当控制台被调出时游戏才不会重置鼠标到屏幕中心。
  当鼠标移动过快时,在一帧内指针很有可能从屏幕中央到达边缘,并撞在边缘上无法继续移动。在此距离基础上,超过屏幕边缘的任何移动都不会被系统采纳,也无法在游戏中反映出来。因此当鼠标移动过快时,准星经过的距离会小于鼠标移动距离,这就是对于常见负加速的解释。
  由此可知,负加速与OS的加速度毫无关联,是任何去加速补丁都无法左右的现象。只有使用Raw Input或DirectInput才能根除负加速。高鼠标CPI,低分辨率会加剧负加速,显然提高分辨率对CS选手并不现实,所以降低CPI是避免负加速的最有效途径。

4比例系数与6/11回顶部

  比例系数与6/11
  对于所有常见的Windows系统,如果EPP关闭,则OS加速处于禁用状态。此时控制面板中的滑块对应一个比例系数用于缩放鼠标的运动,以达到增快或减慢鼠标速度的目的。如果EPP开启,则鼠标速度由比例系数和注册表加速曲线共同控制。下表为控制面板中鼠标灵敏度与比例系数的对应关系:
table1
  为什么在任何系统中都推荐使用默认的6/11?因为只有6/11时倍乘系数为1,此时鼠标移动与指针移动是精确一比一的关系。即便加速已经去除,使用任何其他的档位时,系统都会通过倍乘缩放鼠标移动,导致移动的不准确。
  举例来说,假设控制面板设置为3/11,鼠标移动3个单位,经过运算3*0.25=0.75,指针不会移动;下一次USB回报时报告鼠标再移动2个单位,经过运算2*0.25=0.5,与上次移动余数相加为1.25,这时指针才会移动1个像素。此时定位的不准确是由于倍乘系数<1,导致鼠标的细微运动在屏幕上没有反映。
11/11
除了过快的鼠标速度,强直线修正也会导致这种现象
  假设控制面板设置为9/11,鼠标移动1个单位,经过运算1*2.5=2.5,指针移动2像素;下一次USB回报时报告鼠标再移动1个单位,经过运算1*2.5=2.5,与上次移动余数相加为3,这时指针移动3个像素。这样一来,同样的鼠标移动,在屏幕上却会导致不同的指针移动。而且,即便鼠标以最小单位逐步移动,屏幕上仍有某些像素一定会被跳过,无法用指针精确定位到。此时定位的不准确是由于倍乘系数>1,导致精密定位的困难。

5注册表Mouse Fix的原理和意义回顶部

  注册表Mouse Fix的原理和意义
  注册表的EPP曲线
 curve1
Windows默认的加速曲线,由注册表中五个坐标定义
  在Windows注册表中,EPP加速曲线由五个点定义,而不是一个连续的函数。五个点的XY坐标分别存储于SmoothMouseXCurve和SmoothMouseYCurve中。第一个点永远是(0, 0)原点。鼠标速度是根据五个点的定义坐标由插值(interpolation)和外推(extrapolation)并乘以控制面板中的系数计算出来,并且在XP/Vista中这还错误地涉及显示器刷新率。默认曲线的形状与指数函数类似,如果在EPP启用情况下要去除加速度,就必须将曲线重定义为直线。
curve2
原点附近局部放大图,前四个点对应低鼠标速度,对日常应用影响最大
  鼠标USB回报率对加速度的影响
  如果启用任何形式的鼠标加速,USB回报率会成为一个巨大的影响因素。假设一个鼠标1秒内移动了2000单位,如果回报率为125Hz,每次回报的单位数为2000/125=16,那么针对速度为16的加速曲线会被使用。如果回报率为1000Hz,每次回报的单位数2000/1000=1,那么针对速度为1的加速曲线会被使用。所以此时USB回报率决定了你的鼠标速度落在曲线上的哪个点,对应的指针速度是多少。
  注册表MouseFix
  综上所述我们可以得出结论:只有EPP启用时Mouse Fix才会去除加速;如果EPP保持禁用状态,任何注册表Mouse Fix都是无效的。
  所有注册表补丁的原理是通过修改Windows的加速度曲线,使指针移动与鼠标移动成正比。注册表中定义的加速度曲线仅有当EPP启用时才会生效。所以只要EPP处于禁用状态,鼠标就没有加速度,这些注册表中的无关数值根本不会生效,鼠标速度仅由比例系数决定。一款游戏如果不自动启用EPP,那么保持EPP禁用即可去除加速,此时任何注册表去加速补丁都是无意义的,而且只有6/11可以提供精确一比一。如果一款游戏在运行时强制启用EPP,那么注册表补丁是一种去除加速的方法,虽然不是最佳方法。
  注册表补丁的优势是任何补丁,不论控制面板设置是否为6/11,在EPP开启情况下都可以去加速。而劣势一方面在于需要重启或注销账户才能生效,另一方面大多数补丁只将加速函数改为直线,而没有调整比例系数,无法提供精确一比一的定位。下面我们分析一下常见的注册表Mouse Fix。
  1. CPL Mouse Fix
  最经典的CPL Mouse Fix从XP就开始被玩家广为使用。原始的CPL补丁修改了EPP曲线除原点以外的其余四点在注册表中定义的坐标,斜率分别为4.239990,4.240015,4.240076和4.239990。CPL补丁的所有功能只是将四点修改为十分相近的斜率。所以严格地说,CPL并没有完美地去除加速,而只是将加速度降低到一个难以察觉的尺度。
  在XP、Vista和7中,CPL都可以在EPP启用情况下基本去除加速,但不能提供精确一比一,因为除了强制一次函数以外,鼠标灵敏度的比例并没有被调整为1:1。下图为Mouse Movement Recorder在两个系统中的截图,关于此工具我们之后还会进行详细介绍。
CPL_XP
XP使用CPL:微操作各种被忽略
CPL_7
Win7使用CPL:有明显改善,但由于并非精确一比一仍然一片青葱
  从图中可以看出,CPL尽管去除了加速,但并没有提供精确一比一的鼠标响应。尤其是在鼠标125Hz时,鼠标移动会遭到延迟或舍弃。虽然加速已被去除,但在XP/Vista中缺乏精确一比一会导致指针抖动、漂移,而Win7中不会出现这种现象。
  CPL在不同系统下的鼠标灵敏度比例也是不同的。举几个例子:
  在XP/Vista中,60Hz,DPI=96,6/11,鼠标灵敏度比例为1:0.76。
  在XP/Vista中,75Hz,DPI=96,6/11,鼠标灵敏度比例为1:0.95。
  在XP/Vista中,120Hz,DPI=96,6/11,鼠标灵敏度比例为1:1.52。
  在Win7中,任何刷新率,DPI=100%,鼠标灵敏度比例为1:0.78。
  总结:CPL仅能基本为XP/Vista和Win7去除加速度,没有将屏幕刷新率考虑在内,无法提供精确一比一。
  2. Cheese's Mouse Fix
  由于XP/Vista采用屏幕刷新率调整鼠标灵敏度,Cheese's Mouse Fix的诞生就是为了在XP/Vista中取消屏幕刷新率对鼠标速度的影响,去除加速度,并在6/11时提供精确一比一。
  Cheese's Mouse Fix包括数个以屏幕刷新率命名的文件,可以在不同屏幕刷新率下提供精确一比一。其中CPLModified.reg文件是修正过的CPL版本,该文件将CPL中的四个斜率统一为4.240015。
Cheese_XP
XP使用Cheese:精确一比一
Cheese_7
Win7使用Cheese:大多数一比一,但常有误差
  总结:Cheese为XP/Vista彻底去除加速度,并将屏幕刷新率考虑在内,在6/11时提供精确一比一。
  3. MarkC Mouse Fix与生成器
  MarkC补丁的横空出世弥补了CPL和Cheese的缺憾,解决了Win7下彻底去除EPP加速以及精确一比一的难题。MarkC去除Win7加速的效果与Cheese在XP/Vista中的效果完全一致。MarkC工具分为标准补丁和补丁生成器两款。
  标准MarkC补丁用于在Win7中消除EPP加速并在6/11时提供精确一比一。首先确定桌面字体显示大小(系统默认值100%),并将控制面板中鼠标灵敏度设为默认6/11。然后在管理员权限下根据DPI选择相应补丁导入注册表,最后注销或重启生效。
dpi
桌面右键 选择外观与个性化, 选择显示
  如果用户没有管理员权限,系统会显示部分补丁内容导入失败,这是由于补丁的一部分内容将Windows欢迎屏幕的加速关闭。如果这部分内容导入失败,而用户又使用欢迎屏幕登录系统的话,欢迎屏幕的加速度会使未完全导入的补丁产生误差,鼠标变向时将产生每鼠标单位移动1个像素的误差。1像素的微小误差一般很难注意到,但如果要修复这一问题,有以下几个方法可以任选其一使用:
  1. 右键点击禁用欢迎屏幕加速的Disable_WelcomeScreen+Login_Accel.cmd,以管理员身份运行
  2. 换用管理员账户登录系统,导入Disable_WelcomeScreen+Login_Accel.reg补全缺失的内容,或重新导入整个补丁文件。
  3. 以管理员身份运行regedit,将HKEY_USERS\.DEFAULT\Control Panel\Mouse\MouseSpeed手动改为0
  4. 在欢迎屏幕中不触碰鼠标,仅使用键盘(方向键和回车)选择用户登录系统
  MarkC补丁生成器是一个生成自定义注册表补丁的VBS脚本,用于在任何系统任何设置下EPP启用时提供加速度去除和精确一比一。如果用户不使用6/11或者桌面自定义DPI不在默认选项之中,又希望享受精确一比一定位,MarkC生成器会根据OS版本采取不同公式,为任何控制面板设置、任何自动以桌面DPI、任何屏幕刷新率生成补丁文件。
builder
按步骤输入参数生成专用补丁
  运行MarkC_Windows7+Vista+XP_MouseFix_Builder.cmd或MarkC_Windows7+Vista+XP_MouseFix_Builder.vbs。对于XP/Vista,输入1选择OS类型,输入控制面板显示DPI(默认96)、游戏中的刷新率(-freq设置)以及控制面板中鼠标灵敏度,最后选择比例系数(建议一比一)。对于Win7,输入2选择OS类型,输入控制面板显示DPI(默认100%)以及控制面板中鼠标灵敏度,最后选择或输入自定义比例系数(建议一比一)。以管理员身份运行生成的补丁文件,注销或重启生效。
markc_7
Win7使用MarkC:精确一比一
  虽然MarkC补丁相对于CPL和Cheese有种种优势,但它唯一的劣势就是更容易出现负加速。由于保证了精确一比一,MarkC补丁的鼠标速度较于CPL和Cheese明显更快。举例来说,如果开启EPP,设置为3/11并分别使用CPL和MarkC补丁消除加速,CPL的比例系数为0.31,而MarkC的比例系数为1(精确一比一)。如果出现负加速可以尝试降低鼠标CPI,如果不愿降低鼠标CPI又不在乎精确一比一的话可以直接使用标准MarkC补丁文件,而不使用生成器,这样可以去除加速,但没有精确一比一。
  结论:标准MarkC补丁为Win7完全去除加速,并在6/11时提供精确一比一的鼠标响应。MarkC补丁生成器在标准补丁的基础上,可以为任何控制面板鼠标灵敏度设置和个性化桌面DPI提供精确一比一。

6CS的去加速参数回顶部

  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) 
if ( gEngfuncs.CheckParm ('-noforcemspd', NULL ) ) 
newmouseparms[2] = originalmouseparms[2]; 
if ( gEngfuncs.CheckParm ('-noforcemaccel', NULL ) ) 
newmouseparms[0] = originalmouseparms[0]; 
newmouseparms[1] = originalmouseparms[1]; 
if ( gEngfuncs.CheckParm ('-noforcemparms', NULL ) ) 
newmouseparms[0] = originalmouseparms[0]; 
newmouseparms[1] = originalmouseparms[1]; 
newmouseparms[2] = originalmouseparms[2]; 
mouse_buttons = MOUSE_BUTTON_COUNT; 
/*
  通过分析代码和Valve的文档我们可以得知,对于Goldsource引擎:
  1. 默认运行参数为-useforcedmparms
  2. -noforcemparms“禁用强制鼠标参数”,即恢复桌面鼠标按键设置,解除键位的功能绑定,是以下两个命令的前提
  3. -noforcemaccel“禁用强制鼠标加速”,即恢复桌面鼠标加速设置,在EPP禁用的情况下不自动启用EPP,必须先开启-noforcemparms
  4. -noforcemspd“禁用强制鼠标速度”,即使用桌面鼠标速度设置,此时鼠标速度由控制面板的倍乘系数与CS中鼠标灵敏度相乘共同决定,必须先开启-noforcemparms
  同理,对于Source引擎:
  1'. 默认运行参数为-noforcemparms
  2'. -useforcedmparms“启用强制鼠标参数设置”,是以下两个命令的前提
  3'. -noforcemaccel“禁用强制鼠标加速”,即恢复桌面鼠标加速设置,在EPP禁用的情况下不自动启用EPP,必须先开启-useforcedmparms
  4'. -noforcemspd“禁用强制鼠标速度”,即使用桌面鼠标速度设置,此时鼠标速度由控制面板的倍乘系数与CS中鼠标灵敏度相乘共同决定,必须先开启-useforcedmparms
steam_launch
最常用的两参数在禁用EPP时已经可以完美去加速
  因此在系统EPP禁用的情况下,-noforcemparms -noforcemaccel可以阻止CS 1.6开启EPP,从而达到避免加速的目的。如果使用这两个命令,注册表加速曲线对鼠标速度毫无影响,此时任何注册表补丁都是无效的。所以两参数配合注册表补丁共同使用是多余的,二者任选其一都可以去除加速。
  如果要禁用EPP使用OS无加速设置,使用-noforcemparms -noforcemaccel作为启动参数即可,如果还需要精确一比一,将控制面板设置为6/11。Source引擎不需要添加任何启动参数。
如果要启用EPP使用注册表补丁的去加速正比例函数,不需要使用-noforcemaccel,基本去加速导入修正CPL补丁,精确一比一使用Cheese或MarkC。Source引擎需要添加-useforcedmparms。

7DirectInput与Raw Input回顶部

  DirectInput与Raw Input
  2010年11月Valve在Source引擎升级中加入了Raw Input支持。与注册表补丁修改曲线为正比例函数消除加速的原理不同,Raw Input直接读取原始鼠标输入数据,完全绕过了OS加速度设置,从而根本上解决了加速和负加速的问题。DirectInput与Raw Input类似,也不受OS加速度影响。遗憾的是,Valve没有为CS 1.6加入Raw Input支持,不过幸运的是有工具可以强制程序使用DirectInput或Raw Input。
css_raw_small
Source引擎加入了对Raw Input的支持,彻底根除软件因素导致的加速与负加速
  DInput 1.1是一款强制程序使用DirectInput的程序。首先进入DInput程序所在的上级目录,在文件夹上Shift+鼠标右键,选择在此打开命令提示符,先输入dinput -d创建程序配置文件,然后输入dinput -c编辑配置文件。在弹出的ini文件最后加入以下内容:
[cs]
Enable=true
Buffer=0
Process=hl.exe
Title=Counter-Strike
Verbose=false
  其中Enable控制配置文件是否生效,Buffer为DirectInput中的选项,0或1基本无区别。Process是进程名,Title为窗口标题。配置完成后保存退出,在cmd中运行dinput cs。如果运行时会出现错误DInput Error: Given window not found after 10 attempts in 5 seconds(指定的程序窗口在5秒内10次尝试后均未找到),说明窗口标题输入错误,这可能是由于使用了非标准的CS版本,进入控制管理器或以窗口模式运行CS察看窗口标题并填入Title后即可修复。
dinput
DInput:除了在Process指定进程名以外,Title也必须与窗口标题一致
  DInput会使实际指针位置相较于显示的指针位置偏移一部分,导致用鼠标点击主菜单或H菜单的困难,不过这并不影响游戏内的使用。可以使用控制台用connect连接至服务器,也可以在CS设置完成进入服务器后再运行DInput注入。
  RInput v1.31 Sequential Edition是对前一版本1.2的续作,也是cArn日前在Fnatic官网推荐给大家的工具。与DInput十分类似,RInput强制程序使用Raw Input。1.31版本的改进包括对单进程游戏的更好兼容和的性能改进。RInput不需要配置文件,直接运行RInput.exe后输入进程名hl.exe(区分大小写)即可注入。RInput同样会影响指针位置和游戏菜单,所以也需要使用控制台进入服务器,或者设置进服以后再注入,此外用ESC切换GUI开关也可以恢复指针位置。作为一款发布于2009年4月19日的程序,只到了近期RInput才获得了广泛关注和使用。
rinput
RInput:只需输入进程名,成功注入后cmd倒计时自动关闭
  写到这里大家可能已经有了判断:DInput和RInput是最彻底、最便捷的鼠标工具软件。它们绕过操作系统,从DirectX或WM_INPUT读取鼠标数据并直接作用于程序,完全根除加速和负加速,真正实现了鼠标对指针的精确控制,并且可以针特定进程,不影响系统桌面设置和其他程序,即需即用,没有卸载和权限之忧,可谓居家旅行外出langame勾引MM玩家的必备工具……

8Mouse Movement Recorder回顶部

  Mouse Movement Recorder 
  Mouse Movement Recorder 1.6(MMR)是一款检测鼠标移动与指针移动之间对应关系和USB回报率的利器。MMR的原理是通过对比连续两帧屏幕中的指针位置得到指针位移,并与USB报告的鼠标位移相对比。第一栏为鼠标实际移动,第二栏为指针在屏幕上的移动,第三栏为实时USB回报率,最后一栏是程序检测的EPP是否关闭。绿色表示鼠标灵敏度比例系数<1,即指针移动慢于鼠标移动,红色表示>1,即指针快过鼠标移动。
 MMR_G500
G500 @ 1000Hz
  如果加速度得到去除并且精确一比一的话,前两栏的两个矢量应该恒等。其实去加速没有那么难,上图为Win7 x64 Ultimate环境下无任何附加驱动或补丁,仅通过6/11禁用EPP得到的MMR截图,可以看出这样简单的设置就可以去除加速并得到精确一比一的对应关系。
MMR_error
MMR也会有误报,果断不予理会
  在使用MMR时有几点需要注意。
  1. 绿色或红色不代表一定有加速。如果使用CPL、Cheese或标准MarkC补丁,而滑块不在6/11的话,虽然加速已经去除,但没有精确一比一的关系,MMR也还是会显示绿或红色
  2. 如果用MMR测试时有游戏在运行,游戏频繁将指针重置到屏幕中央会使MMR的检测失效(如CS,COD)
  3. 如果使用了鼠标厂商的驱动管理速度和加速度,MMR无法检测到驱动在底层对鼠标数据施加的加速度
  4. 如果MMR绝大多数时显示精确一比一,仅时而显示绿红相邻的两行或数行,而这几行内的总位移相等的话,那这是由于MMR的工作机制决定的,并不代表加速。举例来说如果系统资源紧张或鼠标USB回报率很高,在USB下一次报告鼠标移动时Windows还没有更新指针位置,这时MMR会纪录0 x 0,当系统终于反应过来根据两次报告的位移更新指针位置后,MMR探测到的指针位移是前两次之和,于是再次高亮显示。从上图第三栏频率可以看出这种延迟一般在1ms左右,与加速度无关而且完全可以忽略不计。

9关于Windows 7的调试回顶部

  关于Windows 7的调试
  鼠标方面
  为什么有些人觉得Win7鼠标特别难调?经过前面所说的相信大家心里已经有数。XP/Vista与Win7采用了截然不同的公式和运算法则,系统间所有的不同就在于屏幕刷新率,显示DPI,USB回报率,使用相同的去加速方法还是很容易得到不同结果。所以最为推荐的方法是在任何系统环境下统一使用DInput或RInput去加速并获得精确一比一,此时鼠标速度可以通过鼠标DPI或游戏中sensitivity/zoom_sensitivity_ratio调整。
  如果你实在习惯了在XP中使用CPL补丁不带参数去加速,又不在乎精确一比一的话,MarkC补丁的作者给出了一个公式,使用如下公式计算系数,填在MarkC补丁生成器最后一步即可生成与XP鼠标速度相同的Win7去加速补丁。
eq10
  其中XP显示DPI默认为96,XP注册表鼠标灵敏度为注册表HKCU\Control Panel\Mouse\MouseSensitivity的值。MouseSensitivity数值与控制面板中鼠标灵敏度滑块的对应关系如下
table2
  其他方面
  Win7掉FPS一般是程序、服务、甚至SXE导致的,一般与系统无关。首先要保证升级系统和显卡驱动,电源选项设为最高性能,强制关闭垂直同步,高性能3D模式,fps_max 101。其次推荐64位系统,笔者以前用32位安装Steam虽然没有掉FPS,但遇到了走路慢的问题。
  其他可尝试的方案有关闭其他占用内存和CPU的程序,在任务管理器中提高hl.exe优先级至高于标准,为进程指定单CPU内核,启动参数加入-nojoy减少内存使用,-heapsize 262144分配更多内存空间,-dxlevel指定DX版本,降低图像参数。
  另有极少数用户反映换用Win7后ping有所增高。在某些环境下Multimedia Class Scheduler(MMCSS)服务会引起网络节流,导致ping的上升。MMCSS可以使多媒体程序自动得到更高CPU资源优先级,保证媒体的流畅。常见的解决方法是在注册表HKLM\SYSTEM\CurrentControlSet\services\Audiosrv\DependOnService中删除MMCSS一行,重启后进入services.msc禁用MMCSS。不过这种方法很可能引起媒体不能流畅播放。
MMCSS
大部分用户不会受MMCSS影响ping变高,修改此键值后ping也不会降低
  正确的处理方式是保留MMCSS键值和服务,但禁用其网络节流功能,如上图进入注册表将HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex改为十六进制FFFFFFFF或十进制4294967295,重启生效。

10硬件与驱动因素回顶部

  硬件与驱动因素
  说了很多普遍适用的OS、程序和软件工具方面的问题,但鼠标本身及其驱动也是不可忽视的一环。鼠标需要注意的问题包括光头丢帧,硬件加速和直线修正(预测)。
  丢帧是个无法克服的问题,只能通过换鼠标/垫子组合来解决。一般来说布垫兼容性最好,塑胶其次,玻璃最差。光头丢帧不仅会导致常见的鼠标满天飞,比如IE3和IO1.1的丢帧还会导致负加速的现象。据说这是由于一般的引擎如果丢帧会发送错误的鼠标移动数据,导致指针的大幅错误移动,而微软的第二代IntelliEye引擎如果追踪失败则不会发发送任何移动数据,所以指针不会乱飞而是停在原地,导致了快速挥动时转身不足。有用户报告某些垫子上通过调整USB回报率至500Hz或1000Hz可以减轻此现象,但IE/IO丢帧负加速的问题只能通过更换鼠标根除。
  硬件加速并不常见,典型代表是Kinzu。更新固件有可能会解决硬件加速的问题,但软件手段是断然无能为力的,所以很多无法忍受加速的选手果断放弃了Kinzu。
G500_IE3
IE3.0和IO1.1广受称赞的就是引擎无任何修正,罗技的修正也不强且开关自由
  直线修正也是一个备受唾弃的功能,虽然少数用户喜欢修正带来的稳健感,但对于使用专业鼠标垫、需要精确定位的用户是无法容忍的。多数鼠标的修正是由引擎决定的不可更改,少数采用高端引擎的鼠标可以通过驱动或刷新固件来调整直线修正的开关及程度。比如罗技驱动中有角度锁定的选项,Razer老版1800cpi蝰蛇可选固件是否包含漂移控制,SteelSeries驱动中提供FreeMove和ExactAim两个选项。内建硬件强修正的代表是Zowie EC系列,可笑的是某些枪文鼓吹厂家通过提高USB回报率的设计来“抵消”修正,实际上任何用户都可以用简单测试一辨真伪,徒手画直线顷刻之间变得轻而易举。 

EC
自从用了EC,手也不抖了甩枪也不斜了,身体倍儿好吃嘛嘛香

  微软的驱动基本与系统设置为一体。罗技驱动可以选择由驱动管理或由OS管理鼠标速度和加速度,如果选择由驱动管理,则驱动绕过系统完全接管鼠标,在任何系统环境下可以提供统一的手感。Razer驱动因鼠标和版本而异,某些驱动界面实际调整的是OS控制面板设置,某些驱动可以提供单独的速度和加速度设置,此外据用户反应某些版本存在bug,更改驱动设置并无效果。
  结语
  工欲善其事必先利其器,在选择了一款适合个人的鼠标后,软件方面的调试同样至关重要。诚然硬件和软件都不是最重要的,但却能显着影响能力的发挥。通过本文的介绍大家应该可以对鼠标调试的方方面面有一个清晰的认识,解释不同环境下调试结果不同的原因,并能找到最适合自己的方案。希望大家首先在调试机器方面与最高水平接轨,从而可以在不被客观条件束缚的环境下充分专注于个人能力的提升。最后特别感谢大神Mark Cranness对本文的贡献,他的杰作MarkC补丁、补丁生成器,对MMR的修订升级以及对鼠标问题耐心透彻的阐释使所有鼠标用户获益匪浅。作者才疏学浅,疏漏歧误在所难免,欢迎大家提出评论和建议使本文趋于完善。
  参考
  http:///index.php/component/option,com_smf/Itemid,99/topic,8637.msg70031/
  http://www./mouse/
  http://donewmouseaccel./

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多