注册表项中SmoothMouseXCurve
的数据的格式是什么:SmoothMouseYCurve
HKEY_CURRENT_USER\Control Panel\Mouse
答案1
这两个注册表项包含鼠标加速度图拐点(在本例中为图形中产生曲线的点)的 5 个坐标对。SmoothMouseXCurve 包含 X 坐标点,SmoothMouseYCurve 包含 Y 坐标点。
第一个点始终为 0,0,指的是曲线图的起点。因此,如果您检查您的值,您会注意到两个注册表值的第一行都是00,00,00,00,00,00,00,00
。随后的每一行都会在图中引入一个拐点。第五个点之后的任何点都不是必需的,因为 Windows 会根据这 5 个点推断出图的其余部分。
每个坐标对(注册表项中的五行中的每一行)都以 16.16 定点格式(16 位整数 + 16 位小数)编写。因此,您将始终只使用每行的前 4 个十六进制数。2 个表示整数部分,2 个表示小数部分。
编辑:这是一篇关于XP中的鼠标加速。它仍然适用于 Vista 和 Windows 7。但是,据我所知,公式略有变化,因此,如果您打算绘制自己的加速度图,则不应相信这些公式。无论如何,它让您了解自那时以来没有改变的过程。
答案2
上面提到的文章现在已经失效了,已归档,并对问题给出了完整的技术解释答案。
Windows XP 的指针弹道
更新日期:2002 年 10 月 31 日
弹道性能总结
本文介绍了 Microsoft Windows XP 的指针弹道算法,适用于硬件工程师、驱动程序开发人员、测试经理和独立硬件供应商。新算法克服了以前操作系统中弹道算法的一些限制和缺陷。主要功能是无论指针速度设置如何,指针移动都更加平滑。
适用于 Windows XP 的指针弹道目标
Windows XP 指针弹道的目标是修复早期的问题并:
- 允许有效导航高分辨率和高 dpi 屏幕,同时保持像素级别的指针精度。
- 使指针的移动更加平滑。
- 根据总矢量(而不是单独的 X 和 Y 坐标)对速度输入应用增益因子。
- 在选择对象时尽量减少移动,以便用户能够选择相隔一个像素的对象
- 去除先进的按钮并设计统一的加速度和速度滑块,以简化用户界面鼠标属性对话框。
Windows XP 之前的弹道问题
Windows XP 之前版本的指针弹道问题包括以下内容:
- 加速度分别作用于 X 轴和 Y 轴,因此会偏向幅度最大的轴。例如,在弹道打开的情况下,当以完美的圆形移动指点设备时,生成的图形看起来更像一个带圆角的正方形,而不是圆形。
- 拥有高分辨率和高 dpi(每英寸点数)屏幕的用户需要更快的指针速度,而旧弹道无法处理快速指针速度和精细精度(能够瞄准每个像素)。在高速指针设置下,无论速度如何,指针都会跳过像素,从而无法进行精细精度选择。
- 加速度和速度设置的用户界面令人困惑,因为大多数用户不明白此处“加速度”一词的含义。
Windows XP 指针弹道基本理论
对于 Windows XP,我们设计了一个传递函数,将鼠标的实际速度与屏幕上指针的实际速度联系起来。然后对该传递函数应用一种算法来计算传递的指针数据。为了通过赋予传递函数物理意义来改进设计,首先将系统的任意单位转换为物理单位。
与物理单位相关
通过获取鼠标(称为米奇)的 X 或 Y 值并使用鼠标总线的更新率和指点设备的分辨率对其进行缩放,将鼠标的任意单位转换为物理单位:
USB 鼠标的典型总线更新率为 125 Hz,典型指针分辨率为 400 米奇/英寸。鼠标发出的每个数据包的米奇大小的典型范围在 0 到 +50 之间,但数据包结构中允许 +127。例如,如果标准 USB 鼠标每个数据包的恒定输出为 3 米奇,则该设备的物理速度为 0.9375 或大约 1 英寸/秒。
为了将屏幕从任意单位转换为物理单位,使用了以下关系:
例如,典型的 17 英寸显示器以 1024 X 769 运行,其分辨率约为 80 dpi,刷新率约为 75 Hz。因此,如果数据未从上例中转换(默认设置,无弹道),则在每包 3 个米奇的情况下,指针在屏幕上的物理移动速度为 2.8 英寸/秒。因此,使用 USB 鼠标和具有上述规格的 17 英寸屏幕,物理到虚拟的增益为 3(2.8/9.375)。换句话说,指针在屏幕上的物理速度是鼠标物理速度的三倍。
父级转移函数
当物理单元建立后,根据可用性研究构建了父传递函数。父传递函数如下图所示:
传递函数由 5 个点组成。其中 4 个点位于鼠标速度谱的低端。超出 4 英寸限制的速度是线性外推的。
曲线家族
从父曲线推断出一系列曲线,以产生具有不同速度和加速度属性的传递函数,如下图所示。用户使用鼠标指针速度滑块选择其中一条曲线鼠标属性对话框 (指针选项标签)。
精密机芯
下图显示了传递函数图的临界拐点的更详细视图。
第一条线段的斜率产生的物理到屏幕增益小于一个增益,从而提供精确移动和瞄准屏幕上每个像素的能力,或称亚像素化。亚像素化是指用户必须将鼠标物理地移动得比指针在屏幕上移动的距离更远,从而在低速度下提供高度的精度和稳定性。要实现亚像素化,必须保留除以余数的鼠标计数并将其添加到下一个计数中。
下图显示了具有曲线系列的相同特写。需要注意的最重要的特征是,无论选择快速曲线还是慢速曲线,第一组点都趋向于亚像素化,这意味着无论鼠标速度设置如何,用户始终能够瞄准屏幕上的每个像素。
计算加速度
传递函数以查找表的形式存储,并在存储值之间插入点。用于查找鼠标 X 和 Y 平移值的数字是传入 X 和 Y 幅值的矢量幅值。Windows XP 之前使用的弹道算法独立计算 X 和 Y 的加速度乘数。因此,指针的移动偏向较大的轴,导致圆角正方形而不是完美的圆形。为了解决这个问题,现在使用 X 和 Y 的矢量幅值来计算加速度乘数,然后应用于平移 X 和 Y 数据。
定点数学和数字界限
弹道 Windows XP 指针算法位于 ring0 和 ring3 之间。因此,浮点数学并不容易获得,而且由于 Windows XP 弹道需要使用有余数的除法,因此使用了定点 (16.16) 整数数学。这对于亚像素化和指针移动的平滑度增加非常重要。因此,两个乘积的最大结果数为 2^16 (65536)。虽然溢出是可能的,但可能性很小。如果将来溢出成为问题,可以轻松更改弹道代码中的定点常数以支持 20.12 定点格式。
改变传递函数
父曲线的值存储在注册表设置中,可以修改和自定义曲线,并且可以通过 GUI 轻松实现。这些特性应允许程序员和用户自定义控制指针弹道以满足各种需求。五个 X 和 Y 对以 16.16 定点格式存储。
Windows XP 弹道算法摘要
以下列表按顺序总结了 Windows XP 中使用的弹道算法:
- 当系统启动或鼠标速度设置更改时,将重新计算并存储转换表。父值存储在注册表中,并以物理单位形式存储,现在通过根据系统参数缩放它们转换为虚拟单位:屏幕刷新率、屏幕分辨率、鼠标刷新率的默认值(USB 125 Hz)和默认鼠标分辨率(400 dpi)。(这可能会在未来发生变化,以实际反映指针参数。)然后根据鼠标滑块速度设置在鼠标属性对话框 (指针选项标签)。
- 传入的鼠标 X 和 Y 值首先转换为定点 16.16 格式。
- 计算 X 和 Y 值的大小并用于在查找表中查找加速度值。
- 查找表由六个点组成(第一个是 [0,0])。每个点代表一个拐点,查找值通常位于拐点之间,因此加速度乘数值是插值的。
- 将上一次计算的余数添加到 X 和 Y,然后应用加速度乘数来转换值。余数被存储起来,以便添加到下一个传入值,这就是启用次像素化的方法。
- 这些值被发送来移动指针。
- 如果关闭该功能(通过清除提高指针精确度鼠标速度滑块下方的复选框鼠标属性对话框 [指针选项tab]),系统的工作方式与没有加速之前一样。所有这些功能都被绕过,系统获取原始鼠标值并将它们乘以基于速度滑块设置的标量集。