人生第一个无线鼠标
一直想拥有一个不带长长尾巴的无线鼠标,假期的时候忘了把鼠标带回来,一直用着触控板,有点不方便.就在pdd下单了两个鼠标.一个有线的(4元钱)一个无线鼠标~(33元吗?忘记了)经过一段时间的等待回来了.我要写篇文章纪念下~~~
鼠标盒子,简简单单(其实就是撒谎也没有)写了一个DPI1600
几乎是全平台使用吧~Linux就没有人权吗?
背面,左右手都可以使用~
扫扫二维码~
里面的说明书
本体出现
背面,一个接收器,一节干电池.
安装好的样子~
4快鼠标.
拆开拍照,一会讲原理
光学器件
正面
俯拍
侧底
这个是什么体位,编不出来了~
cmos传感器~
同上
俩兄弟对比~
结束了吗?没有哦~才开始装13~
首先我们了解一下鼠标GB/T 26245-2010是什么东西?这么说吧,就是国家规定的商品的最低底线,你只要能买到这个商品,这个商品的最低性能就是满足这套规定的.不论这个鼠标是2块钱,还是2w快.它们最低的性能标准都是一样的,就是在一个起跑线上!!!
是怎么一份东西
接下里我们解读一下
不长只有几页
就是会在这些环境参数和机械参数下进行出厂检验.
有的人开玩笑说,第一次是处女用~是吗?并不是,,,出厂前都被高强度那啥了>.<
接下来我们聊一下鼠标的原理
鼠标最早的原型是一种叫做“轨迹球”的定点设备。
机械鼠标主要是由滚球、辊柱和光栅信号传感器组成的。它是通过移动鼠标,带动胶球,胶球滚动又磨擦鼠标内分管水平和垂直两个方向的栅轮滚轴,驱动栅轮转动。栅轮轮沿为格栅状。紧靠栅轮格栅两侧,一侧是一红外发光管,另一侧是红外接收组件。红外接收组件为一三端器件,其中包含甲乙两个红外接收管。在水平和垂直栅轮夹角正对方向有一压紧轮,它使胶球无论向何方向滚动都始终压紧在两个栅轮轴上。
光电机械鼠标工作原理 1:移动鼠标带动滚球。2:X方向和Y方转杆传递鼠标移动。3:旋转编码器的光电刻度盘。4:晶体管发射红外线可穿过刻度盘的小孔。5:光电传感器接收红外线并转换为平面移动速度。
鼠标内控制芯片通过此脉冲相位差判知水平或垂直栅轮的转动方向,通过此脉冲的频率判知栅轮的转动速度,并不断通过数据线向主机传送鼠标移动信息,主机通过处理使屏幕上的光标同鼠标同步移动。
显而易见,这种机械鼠标的精度受到了桌面光洁度、采样精度等多方面因素的制约,因此并不适合在高速移动或者大型游戏中使用。
但适合diy啊!!!
发光二极管照亮采样表面,对比度强烈的待采样影像通过透镜在CMOS上成像,CMOS将光学影像转化为矩阵电信号传输给DSP。当鼠标移动时,DSP则将此影像信号与存储的上一采样周期的影像进行比较分析,然后发送一个位移距离信号到接口电路。接口电路对由DSP发来的位移信号进行整合处理,而已传入计算机内部的位移信号再经过驱动程序的进一步处理,最终在系统中形成光标的位移。
最早的光电鼠标需要使用预先印制的鼠标垫表面上才能检测到鼠标的运动,而现在的光电鼠标如果在透明的表面上工作,就不能检测到鼠标的运动,如玻璃镜面。激光二极管可以使之达到更好的分辨率和精度。使用电池供电的无线光电鼠标通过间歇性闪烁光学组件以节省电力,只有检测到运动时,发光二极管才会稳定地亮起。
激光鼠标,轮到你了
激光鼠标其实也是光电鼠标,只不过是用激光代替了普通的LED光.好处是可以通过更多的表面,因为激光是相干光,几乎单一的波长,即使经过长距离的传播依然能保持其强度和波形;而LED 光则是非相干光。
自己对照我的拆机图,看下光学器件
首先,明确一点,USB设备的驱动都是保存在主机上的,如果主机上没有驱动,那么设备是无法正常工作的。
实际上对于Windows来说,所有设备要想使用,必须在主机上实现装好驱动才行,如果没有,会尝试到网上搜索安装,如果找不到的话,会被作为“不可识别的设备”存在。
对于USB设备来说,它本身首先是一个USB设备,设备插入时USB总线驱动会获得设备的基本描述符信息,并以这些信息查找对应的驱动。
USB设备驱动分为两大类,一类是通用的设备类驱动(class specific),另一类厂商自定义的设备驱动(vendor specific),Windows基本上集成了大部分通用驱动,而很多厂商自定义的设备驱动则需要通过网络或者光盘等事先安装好才行。
我上面截图中,是一个USB鼠标的描述符信息,包括设备描述符和接口描述符(此接口是逻辑层面上的),USB鼠标是通用设备类的设备,蓝色框里的bInterfaceClass是03,表示是HID类的设备,SubClass和Protocol标识了它是一个鼠标,通过这些信息,Windows能识别出这个设备是USB鼠标,在本机查找USB鼠标通用驱动并安装,安装完成后该设备就可以使用了。
如果这个设备碰巧不是一个通用设备类的设备,那么Windows会尝试用设备的VID(idVendor)和PID(idProduct)来匹配驱动,我绿色框里的部分就是这些信息。如果找到了,就安装,如果找不到,就显示设备不可用。
USB无线鼠标跟有线没有本质区别,无线部分是厂商自己实现的,有线部分仍然走的通用的USB协议,如果是蓝牙则是另外的事情(评论里说其实是跟USB HID一样的)。
鼠标的信息本质上是周期性的汇报运动状态,实际上就是按键状态+坐标,主机(Windows)周期性轮询USB鼠标的状态,并在驱动层把这些状态转换成I/O信息,剩下的就是Windows消息栈的事情了,具体就不展开说了,Windows键盘的消息栈大概是这样的(XP时代,Win7以后未分析):
1)硬件中断/硬件端口数据
//WinIO能模拟,或者修改IDT是在这一层
2)键盘Port驱动(USB or PS/2)
//Filter驱动在此
//KeyboardClassServiceCallback也在这一层被调用
3)kbdclass驱动
//处理键盘布局和键盘语言,部分高端的病毒也工作在这里
4)Windows内核边界(zwCreate/zwReadFile)
----------------------(系统调用)----------------------
5)Windows内核边界(zwCreate/zwReadFile)
6)csrss.exe的win32k!RawInputThread读取,完成scancode和vk的转换
//SetWindowHook工作在这里(全局)
//kbd_event工作在这里
7)csrss.exe调用DispatchMessage等函数分发消息
//SetWindowHook工作在这里(进程)
//PostMessage和SendMessage在这里
8)各个进程处理消息
此时插一点前端的小知识:
鼠标的拖拽原理
拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的。下面讲解一下拖拽的原理,希望可以帮助到有需要的朋友!
一、拖拽的流程动作
①鼠标按下
②鼠标移动
③鼠标松开
二、拖拽流程中对应的JS事件
①鼠标按下会触发onmousedown事件
[javascript] view plain copy
obj.onmousedown = function(e) {
//..........
}
②鼠标移动会触发onmousemove事件
[javascript] view plain copy
obj.onmousemove = function(e) {
//......
}
③鼠标松开会触发onmouseup事件
[javascript] view plain copy
obj.onmouseup = function() {
//......
}
三、实现的原理讲解
拖拽其实是通过获取鼠标移动的距离来实现的,即计算移动前的位置的坐标(x,y)与移动中的位置的坐标(x,y)差值。
当鼠标按下或鼠标移动时,都可以获取到当前鼠标的位置,即移动前的位置与移动中的位置。
那么上面①与②的代码就应该变成这样
[javascript] view plain copy
var mouseDownX,mouseDownY // 因在移动中需计算鼠标的偏移需要用到鼠标按下时的坐标,固声明称全局变量
obj.onmousedown = function(e) {
mouseDownX = e.pageX;
mouseDownY = e.pageY;
}
obj.onmousemove = function(e) {
var mouseMoveX = e.pageX,mouseMoveY = e.pageY;
}
移动前与移动后坐标有了,那么计算偏移,先看下图
很明显移动后元素的X坐标为 鼠标移动后的X坐标 - 鼠标按下的X坐标 + 元素的初始X坐标
Y坐标为 鼠标移动后的Y坐标 - 鼠标按下的Y坐标 + 元素的初始Y坐标
把新的 X,Y 替换元素的 X,Y 就搞定了。
那么代码就应该更换为:
[javascript] view plain copy
var mouseDownX,mouseDownY,initX,initY,flag = false;
obj.onmousedown = function(e) {
//鼠标按下时的鼠标所在的X,Y坐标
mouseDownX = e.pageX;
mouseDownY = e.pageY;
//初始位置的X,Y 坐标
initX = obj.offsetLeft;
initY = obj.offsetTop;
//表示鼠标已按下
flag = true;
}
obj.onmousemove = function(e) {
// 确保鼠标已按下
if(flag) {
var mouseMoveX = e.pageX,mouseMoveY = e.pageY;
this.style.left = parseInt(mouseMoveX) - parseInt(mouseDownX) + parseInt(initX) + "px";
this.style.top = parseInt(mouseMoveY) - parseInt(mouseDownY) + parseInt(initY) + "px";
}
}
obj.onmouseup = function() {
//标识已松开鼠标
flag = false;
}
需要注意的事,如果用jquery库来写的话三个事件为mousedown、mousemove、mouseup,名称稍微有点差别。
还有一点,被拖拽的元素的样式要设置成绝对或相对位置才有效果。
接下来聊一些参数问题,就是为什么有的鼠标这么贵~
一、采样率
关于鼠标的采样率,一向有DPI和CPI两种说法。更直观地说,它反映的是鼠标的灵敏度。DPI(Dots Per Inch)是每英寸的像素点数,而CPI(Counts Per Inch)是每英寸测量数。按道理来说,后者才是衡量鼠标性能的指标,它指的是鼠标在平面上每移动 1 英寸向计算机发回的指令数。但是鼠标厂商对DPI的定义却不是经典定义,而是指“每次位移信号对应移动的点数”,也就是说鼠标厂家口中的DPI实际就等同于CPI,大可以把这两个英文缩写看做是异名同实。
目前,DPI越高,鼠标越贵,但是高DPI的鼠标在低分辨率的显示器上几乎无法施展性能。以1000DPI鼠标为例,鼠标在桌面上移动一英寸距离时(折合公制单位为25.4mm),鼠标光标可以在屏幕上移动1000个像素点,用户显示器分辨率如果是1920×1080,用户需要在桌面上移动2英寸的距离(约为51mm),就可以将鼠标从屏幕的最左侧移动到最右侧。
如果想让高档鼠标发挥它应有性能,就需要配备一台4K或者是8K的显示器。
二、回报率。
回报率是鼠标MCU(微型控制单元)将信号处理好后,再反馈给主机的数值,他的单位是Hz。例如,回报率为125Hz,则可以简单的认为MCU每8ms向电脑发送一次数据;500Hz则是每2ms发送一次。回报率是游戏玩家非常重视的鼠标性能参数,理论来说,更高的回报率更能发挥鼠标的性能,对于游戏玩家更具实际意义,我们在鼠标广告中常见的USB回报率指的就是这个。
三、刷新率。
刷新率是鼠标的光学引擎反馈给鼠标MCU(微型控制单元)的参数值,他的单位是FPS(帧/秒)。从定义上来看,它指的是鼠标CMOS成像芯片每秒成像次数,通俗来讲就是说鼠标光学引擎在一秒之内,对鼠标底部连接拍照的次数。比如说,传统的光电鼠标的采样率可以达到3000帧/秒,也就是说它在一秒钟内能采样和处理3000张阴影图像。高刷新率的鼠标可以保障鼠标在高速运动情况下不丢帧。
四:补充
IPS这个词就比较陌生了,IPS是一个速度单位,指的是鼠标每秒移动的速度单位.DPI(Dots Per Inch)是一个计量单位,指的是鼠标移动每英寸扫描的像素点,相同移动距离下,DPI越高扫描到的像素点也就越多,在屏幕上对应移动的像素点也相应地变多,所以我们才会有调节鼠标DPI可以改变鼠标移动快慢这种作用。而对于不同分辨率和不同大小的屏幕,屏幕上的像素点变化,我们也需要通过调节鼠标的DPI来适应屏幕.
最大加速度(g)
关于鼠标移动还有另一个重要的参数,那就是加速度g,参考了标准重力加速度的9.8m/s2,为了描述鼠标移动速度的变化快慢,代表了鼠标可达到最大移速的提升能力,反正这个参数越高越好。
但是你如果是FPS玩家,开启鼠标加速度很可能会影响你的准星移动精准度,在控制面板的“鼠标”选项卡中有一个“提高鼠标精准度”会对加速度进行修正,在取消勾选后,指针的移动距离就不会受加速度影响,无论鼠标的移动加速度有多大,只要移动距离一样,那么指针的移动距离也会固定。没有了加速度,操纵鼠标距离有多远,指针就移动多远,有助于精准定位。
静默距离(mm)
静默距离(Lift off Distance)比较好理解,每个人都知道鼠标在抬起一定高度后移动还会有反应,只有抬到超过静默距离后光标才不会有反应。静默距离和鼠标垫的材质有关,金属这种光反射性强的材质LOD就会高,布垫就比较低。
五:一个建议
不少FPS高手喜欢把辨别率调到极端低,保证帧数能达到200多帧以上.懂就是鼠标别调的太灵敏.玩fps游戏时.
金属滚轮,静音按键,超长续航,10米接收器真的是性价比极高了.
一、mouse rate checker(测试回报率)
100多k的软件
这款软件极其简单,甚至不用介绍,就是用你的鼠标指针在软件的“fove your mouse"区域来回滑动就可以。右侧current rate栏会时事显示当前回报率,右下角的average则是上面回报率的平均数。
这个软件主要是测试早期鼠标上回报率用的,也适用于zowie这种没有驱动和回报率档位显示的鼠标来查看自己当前的回报率。
找出鼠标的响应时间
如果您对它的工作方式感兴趣,可以通过计算WM_MOUSEMOVE消息之间的平均时间来估算频率。
二、mousetest(查看直线修正,丢帧,平滑度)
基本功能方面只对Track功能做一下重点介绍,这是mousetest的核心功能,可以看到鼠标指针在电脑上反馈的点坐标。
这个地方,变换三次DPI
▲在我们勾选Track后,在画图的时候会看到画出的线条上有黑色的坐标点,而坐标点就是鼠标在周期汇报时,报给给电脑的坐标点,这些点连成的线就是鼠标的移动轨迹。
通过观察这些点的位置和间距可以看到鼠标有没有丢帧、平滑不均匀等问题,也可以通过观察线来看鼠标有没有直线修正/角度捕捉。
理论上来讲,回报率越高这些点越密集。
2.其他功能
hide mouse为隐藏右边的鼠标图片,在鼠标上按下按键后,图片上则会对应显示哪个按键被按下,常用来检测鼠标按键是否失灵。
auto plot为自动按下鼠标按键,在mouse test的设定中,按下不同颜色的按键并移动鼠标会画出不同颜色的线条,可以检查微动有没有接触不良,勾选auto polt选项后,即使没用按下按键也会持续画出线条。
LB/RB/MB这些是检测微动有没有双击的,分号前为按下次数,分号后为回弹次数,如果上面显示的数字比实际按下次数多,则证明微动双击了。
Report rate则是实时显示鼠标回报率的。
因为mousetest有汉化的,所以其他功能就让大家自行探索。
3.mouse test画图测试原理和常用的windows画图一样,通过画一些特定的图案来查看鼠标轨迹的平滑度和直线修正,常用的图案有“蚊香图”和“井字图/回形图”,这些图片的具体作用如下:
①蚊香图
蚊香图,顾名思义就是画的像一盘蚊香一样的图,主要用来测试
曲线有很多“锯齿”,这种情况下就是光标抖动导致的。可以侧面反应出鼠标引擎性能不足。
②井字图/回形图
这张图主要是为了反应鼠标是否具有直线修正
回形图和三角形图与上面的用法类似,都是用来看有没有直线修正/角度捕捉的。画图测试并非必须在mouse test中才能测试,Windows画图软件也能实现一样的功能。
很明显,啥也没有.就是鼠标不是坏的.哈哈哈哈哈
突然看见百度搜索的下栏是这样了,好好看
三、mousetester(全功能测试软件)
直接截取鼠标回传的原始数据
https://pan.baidu.com/s/1jHPfGFk?fid=389310751673978
软件可能不好下载,我整了一份...
文件内容~
▲首先description栏填写当前测试鼠标或者任意字符均可,主要是为了在导出的测试图中显示名称。
▲resolution栏可以填写当前鼠标的cpi值,也可以点击measure栏来测试鼠标cpi,具体用法为按下鼠标左键,并向右移动10cm,松开按键时就能看到鼠标当前的CPI值了,这一项主要用来测试鼠标CPI的差异性,像赛睿的鼠标就会经常发生设置CPI与实际CPI值浮动较大的问题。
▲log file栏的两个选项分别加载和导出测试结果,方便发烧友间分享测试数据,导出的结果也可以在excel中查看
2.主要功能
▲mousedata一项进入到了测试重点,collect、log start、plot分别为按下鼠标按键开始搜集、自动搜集、显示测试结果。
在搜集引擎平滑度类数据时,可以选择鼠标画直线或者画圆运用,鼠标速度要快。
在搜集鼠标加速度类数据时,鼠标要较慢匀速移动。
①collect
▲collect为简单测试鼠标的一些数据,用法为按下collect后开始测试,然后再点击鼠标左键不松并移动鼠标开始收集数据,鼠标左键松开后则显示收集结果。
▲松开左键时会立刻显示XY轴移动距离、总移动距离,再按plot键后会显示详细测试结果。
②log start
▲log start和collect功能是一样的,区别是collect为是搜集用户按下按键到松开按键这段时间的数据,而log start是在点击开始后就不断的搜集鼠标信息。
collect更适合搜集短期的一些数据,比如画直线和测试加速度。而log start更适合画圆测试,根据自己的测试方式来选择两种模式。
3.PLOT数据全解析(重点!)
点开plot选项后,mouse tester会给出一个图表,按照大类分为counts、interval、frequency、velocity、sum和轨迹图,除了最后一个X vs. Y以外,其他几项都是以时间为参照对象,我会依次解释一下这几个图的用法。
①counts vs. time
以下是什么值得买用户的文章,我不想研究了.文章够长了
https://post.m.smzdm.com/p/673756/
https://m.sohu.com/a/307595716_641165
还有这篇,也是二次原创,也是参考了什么值得买的文章
▲先来解释一下counts是什么意思,这个图很多人都没有理解意思,甚至我在张大妈上问有个人counts图的波峰和波谷是什么意思的时候,它给我说是代表鼠标开始反向运动。。。。所以先解释一下鼠标定位的原理,如果形象一点的说就是鼠标本身不计算坐标,在我们每次移动鼠标时,鼠标只告知电脑他的偏移量,电脑再根据偏移量和上一个坐标点来确定本次的坐标点。例如上一个坐标为(10,5),而本次X轴向右偏移3个counts,Y轴向左偏移-6个counts,那么电脑则计算当前坐标为(13,-1)。这也可以解释为什么回报率越高CPU负载越高。
而Xcounts vs. time的意思是鼠标告知的电脑X轴的轨迹偏移量,鼠标移动速度越高则X轴越高,这些点会根据Y轴的时间顺序汇成一条曲线,同时图上也绘制出了一条曲线,这条曲线根据作者的说法其实就是这些点的平均值,
而有的人说这是什么函数拟合缺失XSWL。。。。
我们来举两个例子:
▲这张图分别为G502和一个淘宝爆款鼠标在快速画圆时的xCounts图像,从图上就可以看出淘宝爆款出现了大量丢帧和不平滑现象,这条平均线越平滑,则表示鼠标的移动轨迹越平滑;counts的点越接近这条线,就表示引擎的抖动越小。
▲但是并非线越平滑就代表鼠标性能越强,在上一篇引擎百科篇中,我介绍了一次词叫做soomthing(平滑修正),鼠标可以通过平滑修正算法来让这条线强行变的平滑,比如PMW3310。
▲在图像中,波峰和波谷代表一个鼠标移动的速度越趋于稳定,这个时候如果偏移越大则证明抖动越强烈,波峰和波谷也是很具有参考价值的部分。
需要注意的是,回报率也会影响counts的平滑程度,回报率越低曲线越平滑,所以在测试时尽量统一为1000Hz回报率。
▲counts这一项还能测试出鼠标直线修正,继续以A7700为例,我们先用鼠标画一条直线,然后在右下角选择yCounts一项,根据作者的说法,如果有直线修正/角度捕捉的鼠标,y轴的偏移量则会在很长一段时间里保持为0。
②interval和frequency
▲interval为鼠标回报延迟、frequency为回报率,之所以将这两个放在一起说,是因为这两个存在对应关系,在鼠标引擎偏我讲过,125Hz回报率大概是8ms报告一次,1000Hz就是1ms回报一次。
mouse tester相比mouse rate checker的优点是可以将这些这些回报率和延迟信息统计成一个表格曲线,来观察鼠标回报率的稳定性。
③velocity vs. time
velocity的单位是m/s,一项主要是看引擎的加速度,以TM3和A7700为例,TM3的点对于曲线拟合度更好,也就是说跳跃般的急加速很少,而A7700由于激光引擎的先天缺陷,会呈现出上下分离的多层点线,而拟合线则是在这中间呈锯齿状跳跃。
如果有好的设备可以让鼠标匀速移动,在这种情况下速度线是一条直线,如果引擎有加速度的话就会出现波动,这是最理想的测试方法。
④sum vs. time
这一项我还没有全部搞懂,所以暂时不发表看法。
⑤X vs. Y
X vs. Y和mousetest的画图点阵功能非常像,都可以用于检测鼠标丢帧,但是mouse tester的X vs. Y不受屏幕尺寸影响,可以绘制出无限大的轨迹图,上图就是G502和在淘宝爆款鼠标在快速画圆时绘制出来的图像,G502能准确绘制出一个个同心圆,而淘宝爆款因为IPS太低,大量丢帧而无法绘制成形。
有的人看见这么多参数,这么多名词.就有了相信这个就是权威的感觉,其实不然.
这种专业软件,一般玩家连使用它的基本条件都不能满足,用手和感觉输入的数据根本不可靠。在同样的设定下,我想让它离散大还是小,完全可以通过手臂控制得到。
一半大,一半小。
全部小。
全部大。
完全可控,这款软件一般玩家通过手测唯一可靠的数据是usb回报率延时。但是这个数据和光学引擎没有半毛钱关系,滚轮鼠标我都能搞成1000hz USB回报率。
总结一下,对于一个鼠标.其实最重要的是人机工程学的设计,摸着是不是舒服.用着累吗?附加的功能贴心吗?
对于我这个鼠标它不贵,不重,甚至还是老款.但是我还是觉得欧克.其实我也用过更好的,怎么说呢....不玩游戏.没有感觉,带曲线修正的鼠标好评.
这个鼠标支持三档DPi的调节是我最喜欢的地方,直观印象就是好像在调鼠标的灵敏度.游戏时不太灵敏.看文档不灵敏.对精度有要求不灵敏.总之性价比还是有点的.