和FPS游戏有关的鼠标参数杂谈 您所在的位置:网站首页 fps游戏鼠标dpi低了好吗 和FPS游戏有关的鼠标参数杂谈

和FPS游戏有关的鼠标参数杂谈

2024-07-07 22:57| 来源: 网络整理| 查看: 265

鉴于我看到的大部分关于鼠标参数的讨论都缺少一些对游戏机制的了解和定量的分析,我决定给大家分享一些我了解的,但不太能在讨论中看到的东西。

首先介绍一下我的背景。我是学计算机的,能看懂基本的代码,了解一些硬件的基本知识。我修过计算机图形学的课,写过光栅化渲染的代码,看过一些起源引擎的代码,也写过一些FPS的DEMO,所以知道游戏里是怎么显示画面,怎么转动视角,怎么判定命中的。但我不是专业做游戏或者硬件的,所以我了解的东西不一定准确,欢迎专业人士补充指正。

Hitscan武器的命中机制

为了理清瞄准与命中的关系,这里简要介绍一下hitscan型武器的命中机制。在游戏中,我们看到的画面是由一个虚拟的camera(通常位于角色头部)拍到的画面。准星通常在camera拍到画面的中心,camera的朝向(也就是瞄准的方向)通常用一个三维的向量(x, y, z)表示,我们通常只在意这个向量的方向,而不在意它的长度。对hitscan型武器来说,游戏会在每一个逻辑帧判断我们是否开枪了,如果开枪了,就会以camera为原点(极少数游戏会以枪口为原点)发出一条指向(x, y, z)的射线,与这条射线相交的第一个hitbox就是我们击中的目标,不存在子弹的飞行时间,这也就是所谓的即时命中。

有的游戏击中判定是在本地完成的,由本地客户端直接把是否击中目标告诉服务器。这样的一个优点是所见即所得,瞄准了一定能打中,但对延迟稍高的玩家不公平。

有的游戏则是把开枪那一帧的朝向(x, y, z)等数据告诉服务器,由服务器根据一套算法来补偿延迟,判断是否击中。这样更加公平,但瞄准了不一定能打中。

由于击中判定在哪里发生不是玩家能控制的,所以下面我们假设判定是在本地发生的,也就是只要在开枪的那个逻辑帧里上述射线与目标hitbox相交就算击中。注意这里的射线与hitbox都只是游戏里虚拟的几何对象,判定的精度是由游戏中的浮点数精度决定的,几乎可以看成是绝对精确的,与显示在屏幕上的分辨率无关。这里的逻辑帧是csgo中net_graph显示的帧数,不一定对应显示器上的一帧。

实际中确实可能存在屏幕正中心(准星)看起来已经在目标hitbox边缘对应的像素上了,但仍然偏了少于一个像素对应的角度的情况。但鉴于一般目标的hitbox在屏幕上远不止一个像素,屏幕正中心正好在边缘那个像素上还没打中的概率非常低,我们可以认为对hitscan武器来说,只要开枪时屏幕正中心在hitbox上就能命中,相信大家也是这么练习的。

灵敏度与跳像素

虽然游戏中位置和角度的精度可以很高,但由于屏幕分辨率有限,我们肉眼能看到的精度是受限的。如果采用上面“屏幕正中心在目标上就能打中”的观点,我们只需要看起来能够“逐像素”地转动视角,操作的精度在视觉上就足够精细了。我相信这个标准对绝大部分人来说(包括最高水平的职业哥)都是足够的。下面的讨论都是基于这个观点展开的。

那怎样才能不跳像素呢?首先,我们需要知道鼠标给电脑的输入是离散的,鼠标向电脑报告的最小单位是一个“点”,一次不可能报告0.5个“点”。这个“点”就是所谓dots per inch(DPI)中的dot。注意这个“点”与游戏中的像素并没有直接的对应。在起源引擎中开启原始输入并关闭鼠标加速的情况下,鼠标每回报一个点视角会转(灵敏度*0.022)度(0.022是m_yaw值)。而在1080p屏幕106度水平fov(csgo中16:9的默认值)的情况下,屏幕中心的一个像素大概对应0.08度。为了能够“逐像素”地转动视角,我们希望鼠标报告一个点转动的角度要小于一个像素对应的角度。也就是说只要我们的游戏灵敏度低于(0.08/0.022约等于3.6)就不会跳像素,除非你的鼠标有问题,在极低速移动的时候还是每次至少报告2个以上的点。

我认识的绝大部分人只要用不低于800的dpi,在csgo中灵敏度都不会超过3.6,所以灵敏度通常不会导致跳像素。

0.08度的由来

对起源引擎中这段逻辑感兴趣的可以看 github.com/nillerusr/source-engine/blob/master/game/client/in_mouse.cpp 中的MouseMove函数。由于用鼠标控制视角转动的逻辑很简单,大部分游戏的实现都是类似的,所以只要开启原始输入并关闭鼠标加速,要求也是类似的(当然由于分辨率、fov和yaw不同,具体的游戏灵敏度要求会不同)。

对鼠标工作原理感兴趣的可以看看【中英双字】电脑鼠标工作原理 红外鼠标是如何定位的?DPI等参数是什么含义?

标称回报率与实测回报率

一般回报率不超过1000hz的鼠标用的都是USB HID协议。在这个协议下,电脑每隔(1/回报率)秒会主动向鼠标查询移动了多少个点,称为轮询。既然是电脑规律地问鼠标,为什么我们用一些软件测出来的回报率会无法保持标称回报率呢?

一种情况是,鼠标在两次电脑询问的间隔中移动了不到一个点的距离,因此没有向电脑回报数据,测试软件中就没有记录到数据。假设我们使用的是1600dpi 1000hz回报率的鼠标,为了让鼠标每1ms至少报告一个点,我们需要保持鼠标的移动速度在(2.54/1600*1000=1.5875)(cm/s)以上。当我们在测试时,如果鼠标有较大的变向,通常总会有至少1ms以上的时间鼠标的速度达不到1.5875cm/s,因此测出来的回报率必然会低于1000hz。

当然还有另一种可能的情况,就是鼠标虽然在两次电脑的查询间移动了超过一个点的距离,但没有及时向电脑回报。这有可能是传感器给mcu(也就是鼠标上的处理器)的数据有延迟,也可能是mcu没有及时回报给电脑。根据我浅薄的嵌入式经验,以USB HID协议的传输量,在有线的情况下维持1000hz的回报频率对大部分mcu的性能来说都是绰绰有余的。也就是说如果鼠标在高速移动的情况下回报率有大的波动,更有可能是传感器或者无线传输出了问题,当然也可能是mcu的固件写搓了。

如果对鼠标和电脑间传了什么数据感兴趣,可以尝试用wireshark抓抓包,能抓到鼠标向电脑报告的移动和按键数据。我发现电脑和G304似乎会将查询缓存,鼠标可以在电脑的下一次询问之后再回报上一次询问的结果,而不丢失询问的历史,从而减少无线延迟对回报率的影响。

对于回报率超过1000hz的鼠标,似乎没有通用的通信协议,但我觉得用的应该也是电脑向鼠标轮询的模式,这样对电脑性能的影响更可控一些。

回报率与游戏中的性能

那么多少回报率够用呢?假设mcu和传感器能及时稳定地回报数据,采用上面“屏幕正中心在目标上就能打中”的观点,假设屏幕正中心对准目标至少有显示器一帧的时间(高刷显示器上不足10ms),那只需要保证每一帧里至少有一次鼠标回报,我们在瞄准的那一帧里就有机会开枪触发命中判定,击中目标。这大概需要鼠标的回报率至少高于显示器的刷新率。

当然,我们可以再严格一点。由于竞技游戏的逻辑帧数通常可以高于显示器的帧数,所以游戏引擎是可以允许出现瞄准的那一个逻辑帧不在屏幕上显示的情况的。由于游戏在一个逻辑帧里只会更新一次camera的朝向(也就是准星指向的方向),做一次命中判定,就算一个逻辑帧里鼠标回报了多次数据,游戏也只能用到一次对这些回报进行累加的结果。而我们只需要鼠标回报率高于游戏的逻辑帧数就能保证游戏在每个逻辑帧都能读到一次鼠标数据更新,从而在每个逻辑帧都有机会开枪。不过这种准星在目标上不到10ms的瞄准往往会被认为是不稳定的神经枪,对按下鼠标左键的时机要求太高了,最好通过练习尽量避免这种情况出现。作为参考,csgo中头的宽度大概为10,移动速度为250/s,所以即使保持准心不动等目标的头撞上准心,也有大约(10/250)=0.04s=40ms的时间窗口来开枪。

实际情况中鼠标的性能会有波动,所以回报率最好能再高一点。我觉得只要波动不大,回报率能达到游戏逻辑帧数的两倍应该对绝大部分人来说都够用了(包括最高水平的职业哥)。 过高的回报率会影响游戏的帧数,反而可能减少我们能命中的总时间。

由于我的电脑很少能达到500以上的游戏逻辑帧率,我觉得1000hz回报率是一个可以接受的参数。

应该关心什么性能

上面的讨论都没有考虑人体本身的“性能”。如果考虑了人体本身的“性能”,对鼠标的要求可能还能更低。就我个人的水平和手上的鼠标来说,我不太能感受到PMW3360以上传感器的性能差距,许多职业哥的鼠标也是停留在PMW3360,与之类似的hero甚至更差的PMW3310上。我感觉在PMW3360的基础上,鼠标的模具和重量对游戏手感的影响要显著得多。我也怀疑很多人感受到的高端传感器间的性能差异其实来自于模具和重量。如果想要证明高端传感器间的性能差异确实是人可以感知到的,应该要做一做同模具不同传感器的双盲实验。

当然,由于我用的是自己设计的鼠标外壳,如果有性能更好,更省电,价格也合理的鼠标主板出现,我可能也会考虑换个主板玩玩。

假设有一个人对鼠标传感器和mcu的敏感度远高于我,那什么参数会显著地影响到他的游戏体验呢?我能想到以下这几个:

首先是mcu和传输的稳定性。如果一个鼠标有1000hz的回报率,但由于mcu的固件写搓了,或者受到无线干扰,回报时间经常有100ms以上的波动,那确实会导致原来能打中的枪打不中了,影响实际的游戏体验。不过我认为目前大厂基本都能做好这一点。我们可以通过保持鼠标高速移动时看回报点时间间隔的稳定性来判断这个参数的好坏。只要大厂的程序员水平正常,我相信鼠标低速移动时mcu和传输的稳定性是不会更差的,只不过可能无法从mousetester一类测试软件中看出来(因为鼠标移动不足1个点时不会回报)。

那mcu和传输的稳定性要多好才够呢?按回报率与游戏中的性能里的分析,只要高速移动鼠标时回报点间的最大时间间隔小于(1/游戏逻辑帧数)秒就够用了。

接着是传感器的一致性,也就是鼠标每次移动相同的一段距离后,传感器回报总点数的稳定性。传感器回报的点数与我们游戏中视角转动的角度直接相关,我们当然希望鼠标每次移动相同的距离,视角就能转动相同的角度。目前网上测试得更多的是鼠标实际dpi与标称dpi的偏差,这个我倒是觉得没那么重要。实际dpi与标称dpi的偏差可以通过灵敏度来补偿,假设鼠标的标称dpi是1000,但实际dpi是900,我们只需要把灵敏度除以0.9就能使得鼠标移动相同的距离时视角转过的角度与1000dpi时相同,得到几乎一样的手感。但如果一个鼠标移动1英寸时而回报900个点,时而回报1100个点,那就算实际dpi的期望值与标称的1000一样,也会极大地影响游戏体验。

那传感器的一致性多高才够呢?这其实要根据游戏场景来定,最好能比最后一次定位时(目标占的视角角度/视角转到目标上需要转的角度)小一个数量级。上面的这个数值也可以用最后一次定位前(目标在屏幕上的宽度/目标离屏幕中心的距离)做一个粗略的估计。对我个人而言,0.1%-1%的传感器一致性波动完全是可以接受的。尽管这只是一个粗略的估计,但大部分人每次动作的一致性都未必能达到这个数量级,更高的传感器一致性也就未必能带来游戏表现的显著提升。想稳定地打得更准,还是得练好预瞄和二次定位,让最后一次定位前目标离屏幕中心尽可能近。

更新:用3d打印机简陋地测试了一下hero和3395的一致性,长距离的累计误差都不到0.5%,基本符合3395标称数据0.4%的量级(见www.pixart.com/products-detail/129/PAW3395DM-T6QU)。

这个误差是什么概念呢?从屏幕边缘转到屏幕中心大概是50度,0.5%的误差大概是0.25度,在1080P显示器上大约对应3个像素。半个屏幕的甩枪误差稳定在3个像素以内,基本上只有暴力挂才能做到了。大部分情况下最后一次定位应该都不会超过1/6个屏幕,这样鼠标带来的误差就不到一个像素,完全够用了。

用200mm/s的速度反复左右移动GPW 40mm的数据,基本都能回到原点。这么简陋的测试方法肯定会引入额外的误差,实际误差应该更小。

更新:

换了靠谱一点的测试方式,结果区别不大。

然后是传感器的稳定性,也就是最近一些讨论中提到的PAW3370可能存在的问题。我们希望在匀速移动鼠标,鼠标回报率稳定时,每次鼠标回报的点数也是稳定的。由于传感器在侦测到移动后不一定会即时报告给mcu,有可能存在鼠标移动一大段距离回报的总点数稳定,但其中的每一次回报点数波动很大的情况。这种情况对甩枪的影响或许不大,但可能会在平滑移动鼠标时造成画面抖动。体现在测试结果上,就是匀速移动鼠标时鼠标向电脑报告的时间间隔稳定,但每次报告点数的波动很大。

那稳定性多少才够呢?在有G-SYNC一类机制的前提下,只要在跟枪时每个显示器帧里鼠标回报总和的波动小于一个像素对应的回报点数,那就算用高速摄像机也很难看出波动。如果没有G-SYNC一类的机制,可能就需要每个逻辑帧里鼠标回报总和的波动小于一个像素对应的回报点数。根据灵敏度与跳像素中的分析,这个点数是和灵敏度相关的,我们可以通过降低灵敏度来提高一个像素对应的回报点数,从而减轻波动的影响。但如果在此同时提升dpi,可能又会增加波动本身,结果很难预料。

更新:写了一个小工具来测试每个显示器帧中的波动(github.com/benkyoujouzu/mousesniff)。由于是调用别人封装好的api来获取原始数据,所以可能引入额外的性能波动,不过应该会比游戏本身的性能波动小,所以还是有参考价值的。

在144hz刷新率下用254mm/s的速度移动鼠标时,1000hz回报率的hero和3395在每个显示器帧中的波动从数据上看还是比较明显的。但在60hz刷新率下用手移动鼠标时,这种波动几乎就看不到了,可以猜测更高的回报率可能会改善这种波动。不过这种波动能否被人分辨,以及对游戏表现有没有影响,可能还需要实验才能说明。1000hz下的波动在游戏中的影响可以看 www.bilibili.com/video/BV15b4y1a7aK 10分40秒处,实际的影响应该会比慢放更小。

绿线是以254mm/s的速度移动3395鼠标,在144hz刷新率的每个显示器帧中的总数据。绿线是用手移动3395的鼠标,在60hz刷新率的每个显示器帧中的总数据。

更新:

在我的电脑上,vgn f1 pro max的4khz比1khz更差,2khz和1khz差不多,没有显著优势。可以看到在500khz以上鼠标单次回报点数的大小对最终效果影响并不大,而应用实际获取到数据的时间波动反而会造成比较大的影响。4khz更坏的原因可能就是占用了更多的资源,导致测试应用实际获取到数据的时间波动更大。由于硬件、操作系统和游戏本身带来的性能波动都会影响到应用真正获取到数据的时间,单靠鼠标可能很难有显著的改善。

最后是延迟。但根据网上的数据,鼠标延迟已经到10ms的量级了,和游戏的帧生成时间差不多,改进的空间可能不会很大,人能感知到的变化也非常有限。我觉得目前大厂旗舰的水平就基本够用了。

结语

在了解了上面的这些知识,并自己实际做了一些小测试后,我就很少纠结鼠标传感器了。

另外大家可以试试我写的小玩具 benkyoujouzu.github.io/fps-mouse-tester ,这个DEMO会在显示器的每一帧里在准星瞄准的位置留下一个记号,让大家对视角的转动速度有一个直观的感受。

补充:对8000hz回报率鼠标的分辨实验

写完后发现了一篇研究8000hz回报率的鼠标在240hz和360hz显示器上是否可以被人分辨出来的论文。这篇论文的理论是:由于鼠标的回报和屏幕的刷新不同步,就算匀速移动鼠标,屏幕的每帧里鼠标回报点的总数也可能会有波动,从而造成指针抖动,被人察觉。而回报率越高,每帧里鼠标回报点数的波动就越小,也就越难察觉。

论文引用如下:

Ham, A., Lim, J., & Kim, S. (2021, October). Do We Need a Faster Mouse? Empirical Evaluation of Asynchronicity-Induced Jitter. In The 34th Annual ACM Symposium on User Interface Software and Technology (pp. 743-753).

这篇论文找了11个人在240hz显示器上测试,又找了另外12个人在360hz显示器上测试。实际使用鼠标的测试结果如下:

在240hz显示器上,11个人中有4个人能分辨500hz和8000hz的鼠标回报率,只有1个人能分辨1000hz和8000hz,没有人能分辨2000hz、4000hz和8000hz。

在360hz显示器上,12个人中有8个人能分辨500hz和8000hz,没有人能分辨1000hz和8000hz。比较迷的是有两个人能以不高的置信度分辨2000hz和8000hz,但却分不清1000hz和8000hz,实验者觉得可能是蒙对的。没有人能分辨4000hz和8000hz。

总的来说,在240hz以上刷新率的显示器上,23个人中有12个人能分辨500hz和8000hz的回报率,但只有1个人能较有把握地分辨1000hz与8000hz回报率。

那么这样的区别对操作表现有怎样的影响呢?这篇文章又找了另外的13个人用Fitts's Law的指标测试了使用不同回报率时的操作表现,结果发现没有显著的影响(甚至回报率低时表现得更好一点点)。(关于Fitts's Law的简要介绍也可以看我之前的文章)。

尽管这篇论文的样本量似乎还是少了点,并且想强调的结论是1000hz以上的回报率对一些人来说是可察觉的,但和本文的说法其实不矛盾。下面提几点值得注意的地方:

根据这篇文章引文里的结果,没有人能在实验中分辨出20ms以下的点击延迟,人是很难感受到1ms这个粒度的时间差异的。那为什么有人能分辨1000hz回报率和8000hz回报率的鼠标呢?这可能是因为鼠标指针在人眼里有超过1ms的视觉暂留,而这时屏幕就扮演了一个类似打点计时器的角色,将时间上的微小抖动放大成了空间上可见的抖动。

可能只有少部分人能在360hz的显示器上通过鼠标指针的移动分辨1000hz和8000hz的回报率,对大部分人来说这个区别是难以察觉的。

按这篇论文的理论,1000hz以上的鼠标回报率在144hz显示器上可能是无法察觉的。

目前还没有证据证明500hz以上的回报率能让人在用指针点击目标的任务上有提升。打不中还是不能怪回报率。如果按人对点击延迟的敏感程度要求每次点击至少有20ms的时间窗口,那500hz确实不会有多少影响。

最后,提升鼠标回报率确实可以改善本文中提到的每帧鼠标回报总点数的稳定性。

总而言之,在不超过360hz的显示器上,1000hz的回报率可能对大部分人来说都够用了。这个够用有两个角度:一个是更高的回报率可能看不出区别;另一个是更高的回报率不会让人有更好的操作表现。这里可能有一点违反大家的直觉:看得出的区别不一定能导致操作表现的区别,目前的实验结果就是如此。

本文正文中的分析针对的主要是不同参数对操作表现的可能影响,也就是在控制其他变量的情况下,参数的改变会不会让原来能打中的操作打不中了。至于人是否能感受到不同参数间的区别,能感受的区别到底是来自鼠标回报率的提升,还是游戏帧率的降低,或是两者兼有,这些在个体间可能差异很大,而目前实验结果有限,难以做一个定论。不过根据引文的统计结果,在不超过360hz的显示器上,对1000hz以上回报率敏感的人可能是少数。

当然,如果有其他更强有力的实验证明更高回报率的鼠标会有对游戏表现有更显著的提升,我也会考虑尝试一下。(或者像这篇论文一样让雷蛇送一个)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有