和FPS游戲有關(guān)的鼠標(biāo)參數(shù)雜談
鑒于我看到的大部分關(guān)于鼠標(biāo)參數(shù)的討論都缺少一些對(duì)游戲機(jī)制的了解和定量的分析,我決定給大家分享一些我了解的,但不太能在討論中看到的東西。
首先介紹一下我的背景。我是學(xué)計(jì)算機(jī)的,能看懂基本的代碼,了解一些硬件的基本知識(shí)。我修過(guò)計(jì)算機(jī)圖形學(xué)的課,寫(xiě)過(guò)光柵化渲染的代碼,看過(guò)一些起源引擎的代碼,也寫(xiě)過(guò)一些FPS的DEMO,所以知道游戲里是怎么顯示畫(huà)面,怎么轉(zhuǎn)動(dòng)視角,怎么判定命中的。但我不是專(zhuān)業(yè)做游戲或者硬件的,所以我了解的東西不一定準(zhǔn)確,歡迎專(zhuān)業(yè)人士補(bǔ)充指正。
Hitscan武器的命中機(jī)制
為了理清瞄準(zhǔn)與命中的關(guān)系,這里簡(jiǎn)要介紹一下hitscan型武器的命中機(jī)制。在游戲中,我們看到的畫(huà)面是由一個(gè)虛擬的camera(通常位于角色頭部)拍到的畫(huà)面。準(zhǔn)星通常在camera拍到畫(huà)面的中心,camera的朝向(也就是瞄準(zhǔn)的方向)通常用一個(gè)三維的向量(x, y, z)表示,我們通常只在意這個(gè)向量的方向,而不在意它的長(zhǎng)度。對(duì)hitscan型武器來(lái)說(shuō),游戲會(huì)在每一個(gè)邏輯幀判斷我們是否開(kāi)槍了,如果開(kāi)槍了,就會(huì)以camera為原點(diǎn)(極少數(shù)游戲會(huì)以槍口為原點(diǎn))發(fā)出一條指向(x, y, z)的射線(xiàn),與這條射線(xiàn)相交的第一個(gè)hitbox就是我們擊中的目標(biāo),不存在子彈的飛行時(shí)間,這也就是所謂的即時(shí)命中。
有的游戲擊中判定是在本地完成的,由本地客戶(hù)端直接把是否擊中目標(biāo)告訴服務(wù)器。這樣的一個(gè)優(yōu)點(diǎn)是所見(jiàn)即所得,瞄準(zhǔn)了一定能打中,但對(duì)延遲稍高的玩家不公平。
有的游戲則是把開(kāi)槍那一幀的朝向(x, y, z)等數(shù)據(jù)告訴服務(wù)器,由服務(wù)器根據(jù)一套算法來(lái)補(bǔ)償延遲,判斷是否擊中。這樣更加公平,但瞄準(zhǔn)了不一定能打中。
由于擊中判定在哪里發(fā)生不是玩家能控制的,所以下面我們假設(shè)判定是在本地發(fā)生的,也就是只要在開(kāi)槍的那個(gè)邏輯幀里上述射線(xiàn)與目標(biāo)hitbox相交就算擊中。注意這里的射線(xiàn)與hitbox都只是游戲里虛擬的幾何對(duì)象,判定的精度是由游戲中的浮點(diǎn)數(shù)精度決定的,幾乎可以看成是絕對(duì)精確的,與顯示在屏幕上的分辨率無(wú)關(guān)。這里的邏輯幀是csgo中net_graph顯示的幀數(shù),不一定對(duì)應(yīng)顯示器上的一幀。
實(shí)際中確實(shí)可能存在屏幕正中心(準(zhǔn)星)看起來(lái)已經(jīng)在目標(biāo)hitbox邊緣對(duì)應(yīng)的像素上了,但仍然偏了少于一個(gè)像素對(duì)應(yīng)的角度的情況。但鑒于一般目標(biāo)的hitbox在屏幕上遠(yuǎn)不止一個(gè)像素,屏幕正中心正好在邊緣那個(gè)像素上還沒(méi)打中的概率非常低,我們可以認(rèn)為對(duì)hitscan武器來(lái)說(shuō),只要開(kāi)槍時(shí)屏幕正中心在hitbox上就能命中,相信大家也是這么練習(xí)的。
靈敏度與跳像素
雖然游戲中位置和角度的精度可以很高,但由于屏幕分辨率有限,我們?nèi)庋勰芸吹降木仁鞘芟薜?。如果采用上面“屏幕正中心在目?biāo)上就能打中”的觀點(diǎn),我們只需要看起來(lái)能夠“逐像素”地轉(zhuǎn)動(dòng)視角,操作的精度在視覺(jué)上就足夠精細(xì)了。我相信這個(gè)標(biāo)準(zhǔn)對(duì)絕大部分人來(lái)說(shuō)(包括最高水平的職業(yè)哥)都是足夠的。下面的討論都是基于這個(gè)觀點(diǎn)展開(kāi)的。
那怎樣才能不跳像素呢?首先,我們需要知道鼠標(biāo)給電腦的輸入是離散的,鼠標(biāo)向電腦報(bào)告的最小單位是一個(gè)“點(diǎn)”,一次不可能報(bào)告0.5個(gè)“點(diǎn)”。這個(gè)“點(diǎn)”就是所謂dots per inch(DPI)中的dot。注意這個(gè)“點(diǎn)”與游戲中的像素并沒(méi)有直接的對(duì)應(yīng)。在起源引擎中開(kāi)啟原始輸入并關(guān)閉鼠標(biāo)加速的情況下,鼠標(biāo)每回報(bào)一個(gè)點(diǎn)視角會(huì)轉(zhuǎn)(靈敏度*0.022)度(0.022是m_yaw值)。而在1080p屏幕106度水平fov(csgo中16:9的默認(rèn)值)的情況下,屏幕中心的一個(gè)像素大概對(duì)應(yīng)0.08度。為了能夠“逐像素”地轉(zhuǎn)動(dòng)視角,我們希望鼠標(biāo)報(bào)告一個(gè)點(diǎn)轉(zhuǎn)動(dòng)的角度要小于一個(gè)像素對(duì)應(yīng)的角度。也就是說(shuō)只要我們的游戲靈敏度低于(0.08/0.022約等于3.6)就不會(huì)跳像素,除非你的鼠標(biāo)有問(wèn)題,在極低速移動(dòng)的時(shí)候還是每次至少報(bào)告2個(gè)以上的點(diǎn)。
我認(rèn)識(shí)的絕大部分人只要用不低于800的dpi,在csgo中靈敏度都不會(huì)超過(guò)3.6,所以靈敏度通常不會(huì)導(dǎo)致跳像素。

對(duì)起源引擎中這段邏輯感興趣的可以看 github.com/nillerusr/source-engine/blob/master/game/client/in_mouse.cpp 中的MouseMove函數(shù)。由于用鼠標(biāo)控制視角轉(zhuǎn)動(dòng)的邏輯很簡(jiǎn)單,大部分游戲的實(shí)現(xiàn)都是類(lèi)似的,所以只要開(kāi)啟原始輸入并關(guān)閉鼠標(biāo)加速,要求也是類(lèi)似的(當(dāng)然由于分辨率、fov和yaw不同,具體的游戲靈敏度要求會(huì)不同)。
對(duì)鼠標(biāo)工作原理感興趣的可以看看【中英雙字】電腦鼠標(biāo)工作原理 紅外鼠標(biāo)是如何定位的?DPI等參數(shù)是什么含義?
標(biāo)稱(chēng)回報(bào)率與實(shí)測(cè)回報(bào)率
一般回報(bào)率不超過(guò)1000hz的鼠標(biāo)用的都是USB HID協(xié)議。在這個(gè)協(xié)議下,電腦每隔(1/回報(bào)率)秒會(huì)主動(dòng)向鼠標(biāo)查詢(xún)移動(dòng)了多少個(gè)點(diǎn),稱(chēng)為輪詢(xún)。既然是電腦規(guī)律地問(wèn)鼠標(biāo),為什么我們用一些軟件測(cè)出來(lái)的回報(bào)率會(huì)無(wú)法保持標(biāo)稱(chēng)回報(bào)率呢?
一種情況是,鼠標(biāo)在兩次電腦詢(xún)問(wèn)的間隔中移動(dòng)了不到一個(gè)點(diǎn)的距離,因此沒(méi)有向電腦回報(bào)數(shù)據(jù),測(cè)試軟件中就沒(méi)有記錄到數(shù)據(jù)。假設(shè)我們使用的是1600dpi 1000hz回報(bào)率的鼠標(biāo),為了讓鼠標(biāo)每1ms至少報(bào)告一個(gè)點(diǎn),我們需要保持鼠標(biāo)的移動(dòng)速度在(2.54/1600*1000=1.5875)(cm/s)以上。當(dāng)我們?cè)跍y(cè)試時(shí),如果鼠標(biāo)有較大的變向,通??倳?huì)有至少1ms以上的時(shí)間鼠標(biāo)的速度達(dá)不到1.5875cm/s,因此測(cè)出來(lái)的回報(bào)率必然會(huì)低于1000hz。
當(dāng)然還有另一種可能的情況,就是鼠標(biāo)雖然在兩次電腦的查詢(xún)間移動(dòng)了超過(guò)一個(gè)點(diǎn)的距離,但沒(méi)有及時(shí)向電腦回報(bào)。這有可能是傳感器給mcu(也就是鼠標(biāo)上的處理器)的數(shù)據(jù)有延遲,也可能是mcu沒(méi)有及時(shí)回報(bào)給電腦。根據(jù)我淺薄的嵌入式經(jīng)驗(yàn),以USB HID協(xié)議的傳輸量,在有線(xiàn)的情況下維持1000hz的回報(bào)頻率對(duì)大部分mcu的性能來(lái)說(shuō)都是綽綽有余的。也就是說(shuō)如果鼠標(biāo)在高速移動(dòng)的情況下回報(bào)率有大的波動(dòng),更有可能是傳感器或者無(wú)線(xiàn)傳輸出了問(wèn)題,當(dāng)然也可能是mcu的固件寫(xiě)搓了。
如果對(duì)鼠標(biāo)和電腦間傳了什么數(shù)據(jù)感興趣,可以嘗試用wireshark抓抓包,能抓到鼠標(biāo)向電腦報(bào)告的移動(dòng)和按鍵數(shù)據(jù)。我發(fā)現(xiàn)電腦和G304似乎會(huì)將查詢(xún)緩存,鼠標(biāo)可以在電腦的下一次詢(xún)問(wèn)之后再回報(bào)上一次詢(xún)問(wèn)的結(jié)果,而不丟失詢(xún)問(wèn)的歷史,從而減少無(wú)線(xiàn)延遲對(duì)回報(bào)率的影響。
對(duì)于回報(bào)率超過(guò)1000hz的鼠標(biāo),似乎沒(méi)有通用的通信協(xié)議,但我覺(jué)得用的應(yīng)該也是電腦向鼠標(biāo)輪詢(xún)的模式,這樣對(duì)電腦性能的影響更可控一些。
回報(bào)率與游戲中的性能
那么多少回報(bào)率夠用呢?假設(shè)mcu和傳感器能及時(shí)穩(wěn)定地回報(bào)數(shù)據(jù),采用上面“屏幕正中心在目標(biāo)上就能打中”的觀點(diǎn),假設(shè)屏幕正中心對(duì)準(zhǔn)目標(biāo)至少有顯示器一幀的時(shí)間(高刷顯示器上不足10ms),那只需要保證每一幀里至少有一次鼠標(biāo)回報(bào),我們?cè)诿闇?zhǔn)的那一幀里就有機(jī)會(huì)開(kāi)槍觸發(fā)命中判定,擊中目標(biāo)。這大概需要鼠標(biāo)的回報(bào)率至少高于顯示器的刷新率。
當(dāng)然,我們可以再?lài)?yán)格一點(diǎn)。由于競(jìng)技游戲的邏輯幀數(shù)通??梢愿哂陲@示器的幀數(shù),所以游戲引擎是可以允許出現(xiàn)瞄準(zhǔn)的那一個(gè)邏輯幀不在屏幕上顯示的情況的。由于游戲在一個(gè)邏輯幀里只會(huì)更新一次camera的朝向(也就是準(zhǔn)星指向的方向),做一次命中判定,就算一個(gè)邏輯幀里鼠標(biāo)回報(bào)了多次數(shù)據(jù),游戲也只能用到一次對(duì)這些回報(bào)進(jìn)行累加的結(jié)果。而我們只需要鼠標(biāo)回報(bào)率高于游戲的邏輯幀數(shù)就能保證游戲在每個(gè)邏輯幀都能讀到一次鼠標(biāo)數(shù)據(jù)更新,從而在每個(gè)邏輯幀都有機(jī)會(huì)開(kāi)槍。不過(guò)這種準(zhǔn)星在目標(biāo)上不到10ms的瞄準(zhǔn)往往會(huì)被認(rèn)為是不穩(wěn)定的神經(jīng)槍?zhuān)瑢?duì)按下鼠標(biāo)左鍵的時(shí)機(jī)要求太高了,最好通過(guò)練習(xí)盡量避免這種情況出現(xiàn)。作為參考,csgo中頭的寬度大概為10,移動(dòng)速度為250/s,所以即使保持準(zhǔn)心不動(dòng)等目標(biāo)的頭撞上準(zhǔn)心,也有大約(10/250)=0.04s=40ms的時(shí)間窗口來(lái)開(kāi)槍。
實(shí)際情況中鼠標(biāo)的性能會(huì)有波動(dòng),所以回報(bào)率最好能再高一點(diǎn)。我覺(jué)得只要波動(dòng)不大,回報(bào)率能達(dá)到游戲邏輯幀數(shù)的兩倍應(yīng)該對(duì)絕大部分人來(lái)說(shuō)都?jí)蛴昧耍òㄗ罡咚降穆殬I(yè)哥)。 過(guò)高的回報(bào)率會(huì)影響游戲的幀數(shù),反而可能減少我們能命中的總時(shí)間。
由于我的電腦很少能達(dá)到500以上的游戲邏輯幀率,我覺(jué)得1000hz回報(bào)率是一個(gè)可以接受的參數(shù)。
應(yīng)該關(guān)心什么性能
上面的討論都沒(méi)有考慮人體本身的“性能”。如果考慮了人體本身的“性能”,對(duì)鼠標(biāo)的要求可能還能更低。就我個(gè)人的水平和手上的鼠標(biāo)來(lái)說(shuō),我不太能感受到PMW3360以上傳感器的性能差距,許多職業(yè)哥的鼠標(biāo)也是停留在PMW3360,與之類(lèi)似的hero甚至更差的PMW3310上。我感覺(jué)在PMW3360的基礎(chǔ)上,鼠標(biāo)的模具和重量對(duì)游戲手感的影響要顯著得多。我也懷疑很多人感受到的高端傳感器間的性能差異其實(shí)來(lái)自于模具和重量。如果想要證明高端傳感器間的性能差異確實(shí)是人可以感知到的,應(yīng)該要做一做同模具不同傳感器的雙盲實(shí)驗(yàn)。
當(dāng)然,由于我用的是自己設(shè)計(jì)的鼠標(biāo)外殼,如果有性能更好,更省電,價(jià)格也合理的鼠標(biāo)主板出現(xiàn),我可能也會(huì)考慮換個(gè)主板玩玩。
假設(shè)有一個(gè)人對(duì)鼠標(biāo)傳感器和mcu的敏感度遠(yuǎn)高于我,那什么參數(shù)會(huì)顯著地影響到他的游戲體驗(yàn)?zāi)兀课夷芟氲揭韵逻@幾個(gè):
首先是mcu和傳輸?shù)姆€(wěn)定性。如果一個(gè)鼠標(biāo)有1000hz的回報(bào)率,但由于mcu的固件寫(xiě)搓了,或者受到無(wú)線(xiàn)干擾,回報(bào)時(shí)間經(jīng)常有100ms以上的波動(dòng),那確實(shí)會(huì)導(dǎo)致原來(lái)能打中的槍打不中了,影響實(shí)際的游戲體驗(yàn)。不過(guò)我認(rèn)為目前大廠基本都能做好這一點(diǎn)。我們可以通過(guò)保持鼠標(biāo)高速移動(dòng)時(shí)看回報(bào)點(diǎn)時(shí)間間隔的穩(wěn)定性來(lái)判斷這個(gè)參數(shù)的好壞。只要大廠的程序員水平正常,我相信鼠標(biāo)低速移動(dòng)時(shí)mcu和傳輸?shù)姆€(wěn)定性是不會(huì)更差的,只不過(guò)可能無(wú)法從mousetester一類(lèi)測(cè)試軟件中看出來(lái)(因?yàn)槭髽?biāo)移動(dòng)不足1個(gè)點(diǎn)時(shí)不會(huì)回報(bào))。
那mcu和傳輸?shù)姆€(wěn)定性要多好才夠呢?按回報(bào)率與游戲中的性能里的分析,只要高速移動(dòng)鼠標(biāo)時(shí)回報(bào)點(diǎn)間的最大時(shí)間間隔小于(1/游戲邏輯幀數(shù))秒就夠用了。
接著是傳感器的一致性,也就是鼠標(biāo)每次移動(dòng)相同的一段距離后,傳感器回報(bào)總點(diǎn)數(shù)的穩(wěn)定性。傳感器回報(bào)的點(diǎn)數(shù)與我們游戲中視角轉(zhuǎn)動(dòng)的角度直接相關(guān),我們當(dāng)然希望鼠標(biāo)每次移動(dòng)相同的距離,視角就能轉(zhuǎn)動(dòng)相同的角度。目前網(wǎng)上測(cè)試得更多的是鼠標(biāo)實(shí)際dpi與標(biāo)稱(chēng)dpi的偏差,這個(gè)我倒是覺(jué)得沒(méi)那么重要。實(shí)際dpi與標(biāo)稱(chēng)dpi的偏差可以通過(guò)靈敏度來(lái)補(bǔ)償,假設(shè)鼠標(biāo)的標(biāo)稱(chēng)dpi是1000,但實(shí)際dpi是900,我們只需要把靈敏度除以0.9就能使得鼠標(biāo)移動(dòng)相同的距離時(shí)視角轉(zhuǎn)過(guò)的角度與1000dpi時(shí)相同,得到幾乎一樣的手感。但如果一個(gè)鼠標(biāo)移動(dòng)1英寸時(shí)而回報(bào)900個(gè)點(diǎn),時(shí)而回報(bào)1100個(gè)點(diǎn),那就算實(shí)際dpi的期望值與標(biāo)稱(chēng)的1000一樣,也會(huì)極大地影響游戲體驗(yàn)。
那傳感器的一致性多高才夠呢?這其實(shí)要根據(jù)游戲場(chǎng)景來(lái)定,最好能比最后一次定位時(shí)(目標(biāo)占的視角角度/視角轉(zhuǎn)到目標(biāo)上需要轉(zhuǎn)的角度)小一個(gè)數(shù)量級(jí)。上面的這個(gè)數(shù)值也可以用最后一次定位前(目標(biāo)在屏幕上的寬度/目標(biāo)離屏幕中心的距離)做一個(gè)粗略的估計(jì)。對(duì)我個(gè)人而言,0.1%-1%的傳感器一致性波動(dòng)完全是可以接受的。盡管這只是一個(gè)粗略的估計(jì),但大部分人每次動(dòng)作的一致性都未必能達(dá)到這個(gè)數(shù)量級(jí),更高的傳感器一致性也就未必能帶來(lái)游戲表現(xiàn)的顯著提升。想穩(wěn)定地打得更準(zhǔn),還是得練好預(yù)瞄和二次定位,讓最后一次定位前目標(biāo)離屏幕中心盡可能近。
更新:用3d打印機(jī)簡(jiǎn)陋地測(cè)試了一下hero和3395的一致性,長(zhǎng)距離的累計(jì)誤差都不到0.5%,基本符合3395標(biāo)稱(chēng)數(shù)據(jù)0.4%的量級(jí)(見(jiàn)www.pixart.com/products-detail/129/PAW3395DM-T6QU)。
這個(gè)誤差是什么概念呢?從屏幕邊緣轉(zhuǎn)到屏幕中心大概是50度,0.5%的誤差大概是0.25度,在1080P顯示器上大約對(duì)應(yīng)3個(gè)像素。半個(gè)屏幕的甩槍誤差穩(wěn)定在3個(gè)像素以?xún)?nèi),基本上只有暴力掛才能做到了。大部分情況下最后一次定位應(yīng)該都不會(huì)超過(guò)1/6個(gè)屏幕,這樣鼠標(biāo)帶來(lái)的誤差就不到一個(gè)像素,完全夠用了。


更新:
換了靠譜一點(diǎn)的測(cè)試方式,結(jié)果區(qū)別不大。

然后是傳感器的穩(wěn)定性,也就是最近一些討論中提到的PAW3370可能存在的問(wèn)題。我們希望在勻速移動(dòng)鼠標(biāo),鼠標(biāo)回報(bào)率穩(wěn)定時(shí),每次鼠標(biāo)回報(bào)的點(diǎn)數(shù)也是穩(wěn)定的。由于傳感器在偵測(cè)到移動(dòng)后不一定會(huì)即時(shí)報(bào)告給mcu,有可能存在鼠標(biāo)移動(dòng)一大段距離回報(bào)的總點(diǎn)數(shù)穩(wěn)定,但其中的每一次回報(bào)點(diǎn)數(shù)波動(dòng)很大的情況。這種情況對(duì)甩槍的影響或許不大,但可能會(huì)在平滑移動(dòng)鼠標(biāo)時(shí)造成畫(huà)面抖動(dòng)。體現(xiàn)在測(cè)試結(jié)果上,就是勻速移動(dòng)鼠標(biāo)時(shí)鼠標(biāo)向電腦報(bào)告的時(shí)間間隔穩(wěn)定,但每次報(bào)告點(diǎn)數(shù)的波動(dòng)很大。
那穩(wěn)定性多少才夠呢?在有G-SYNC一類(lèi)機(jī)制的前提下,只要在跟槍時(shí)每個(gè)顯示器幀里鼠標(biāo)回報(bào)總和的波動(dòng)小于一個(gè)像素對(duì)應(yīng)的回報(bào)點(diǎn)數(shù),那就算用高速攝像機(jī)也很難看出波動(dòng)。如果沒(méi)有G-SYNC一類(lèi)的機(jī)制,可能就需要每個(gè)邏輯幀里鼠標(biāo)回報(bào)總和的波動(dòng)小于一個(gè)像素對(duì)應(yīng)的回報(bào)點(diǎn)數(shù)。根據(jù)靈敏度與跳像素中的分析,這個(gè)點(diǎn)數(shù)是和靈敏度相關(guān)的,我們可以通過(guò)降低靈敏度來(lái)提高一個(gè)像素對(duì)應(yīng)的回報(bào)點(diǎn)數(shù),從而減輕波動(dòng)的影響。但如果在此同時(shí)提升dpi,可能又會(huì)增加波動(dòng)本身,結(jié)果很難預(yù)料。
更新:寫(xiě)了一個(gè)小工具來(lái)測(cè)試每個(gè)顯示器幀中的波動(dòng)(github.com/benkyoujouzu/mousesniff)。由于是調(diào)用別人封裝好的api來(lái)獲取原始數(shù)據(jù),所以可能引入額外的性能波動(dòng),不過(guò)應(yīng)該會(huì)比游戲本身的性能波動(dòng)小,所以還是有參考價(jià)值的。
在144hz刷新率下用254mm/s的速度移動(dòng)鼠標(biāo)時(shí),1000hz回報(bào)率的hero和3395在每個(gè)顯示器幀中的波動(dòng)從數(shù)據(jù)上看還是比較明顯的。但在60hz刷新率下用手移動(dòng)鼠標(biāo)時(shí),這種波動(dòng)幾乎就看不到了,可以猜測(cè)更高的回報(bào)率可能會(huì)改善這種波動(dòng)。不過(guò)這種波動(dòng)能否被人分辨,以及對(duì)游戲表現(xiàn)有沒(méi)有影響,可能還需要實(shí)驗(yàn)才能說(shuō)明。1000hz下的波動(dòng)在游戲中的影響可以看?www.bilibili.com/video/BV15b4y1a7aK?10分40秒處,實(shí)際的影響應(yīng)該會(huì)比慢放更小。


綠線(xiàn)是用手移動(dòng)3395的鼠標(biāo),在60hz刷新率的每個(gè)顯示器幀中的總數(shù)據(jù)。
更新:
在我的電腦上,vgn f1 pro max的4khz比1khz更差,2khz和1khz差不多,沒(méi)有顯著優(yōu)勢(shì)。可以看到在500khz以上鼠標(biāo)單次回報(bào)點(diǎn)數(shù)的大小對(duì)最終效果影響并不大,而應(yīng)用實(shí)際獲取到數(shù)據(jù)的時(shí)間波動(dòng)反而會(huì)造成比較大的影響。4khz更壞的原因可能就是占用了更多的資源,導(dǎo)致測(cè)試應(yīng)用實(shí)際獲取到數(shù)據(jù)的時(shí)間波動(dòng)更大。由于硬件、操作系統(tǒng)和游戲本身帶來(lái)的性能波動(dòng)都會(huì)影響到應(yīng)用真正獲取到數(shù)據(jù)的時(shí)間,單靠鼠標(biāo)可能很難有顯著的改善。




最后是延遲。但根據(jù)網(wǎng)上的數(shù)據(jù),鼠標(biāo)延遲已經(jīng)到10ms的量級(jí)了,和游戲的幀生成時(shí)間差不多,改進(jìn)的空間可能不會(huì)很大,人能感知到的變化也非常有限。我覺(jué)得目前大廠旗艦的水平就基本夠用了。
結(jié)語(yǔ)
在了解了上面的這些知識(shí),并自己實(shí)際做了一些小測(cè)試后,我就很少糾結(jié)鼠標(biāo)傳感器了。
另外大家可以試試我寫(xiě)的小玩具?benkyoujouzu.github.io/fps-mouse-tester ,這個(gè)DEMO會(huì)在顯示器的每一幀里在準(zhǔn)星瞄準(zhǔn)的位置留下一個(gè)記號(hào),讓大家對(duì)視角的轉(zhuǎn)動(dòng)速度有一個(gè)直觀的感受。
補(bǔ)充:對(duì)8000hz回報(bào)率鼠標(biāo)的分辨實(shí)驗(yàn)
寫(xiě)完后發(fā)現(xiàn)了一篇研究8000hz回報(bào)率的鼠標(biāo)在240hz和360hz顯示器上是否可以被人分辨出來(lái)的論文。這篇論文的理論是:由于鼠標(biāo)的回報(bào)和屏幕的刷新不同步,就算勻速移動(dòng)鼠標(biāo),屏幕的每幀里鼠標(biāo)回報(bào)點(diǎn)的總數(shù)也可能會(huì)有波動(dòng),從而造成指針抖動(dòng),被人察覺(jué)。而回報(bào)率越高,每幀里鼠標(biāo)回報(bào)點(diǎn)數(shù)的波動(dòng)就越小,也就越難察覺(jué)。
論文引用如下:
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個(gè)人在240hz顯示器上測(cè)試,又找了另外12個(gè)人在360hz顯示器上測(cè)試。實(shí)際使用鼠標(biāo)的測(cè)試結(jié)果如下:
在240hz顯示器上,11個(gè)人中有4個(gè)人能分辨500hz和8000hz的鼠標(biāo)回報(bào)率,只有1個(gè)人能分辨1000hz和8000hz,沒(méi)有人能分辨2000hz、4000hz和8000hz。
在360hz顯示器上,12個(gè)人中有8個(gè)人能分辨500hz和8000hz,沒(méi)有人能分辨1000hz和8000hz。比較迷的是有兩個(gè)人能以不高的置信度分辨2000hz和8000hz,但卻分不清1000hz和8000hz,實(shí)驗(yàn)者覺(jué)得可能是蒙對(duì)的。沒(méi)有人能分辨4000hz和8000hz。
總的來(lái)說(shuō),在240hz以上刷新率的顯示器上,23個(gè)人中有12個(gè)人能分辨500hz和8000hz的回報(bào)率,但只有1個(gè)人能較有把握地分辨1000hz與8000hz回報(bào)率。
那么這樣的區(qū)別對(duì)操作表現(xiàn)有怎樣的影響呢?這篇文章又找了另外的13個(gè)人用Fitts's Law的指標(biāo)測(cè)試了使用不同回報(bào)率時(shí)的操作表現(xiàn),結(jié)果發(fā)現(xiàn)沒(méi)有顯著的影響(甚至回報(bào)率低時(shí)表現(xiàn)得更好一點(diǎn)點(diǎn))。(關(guān)于Fitts's Law的簡(jiǎn)要介紹也可以看我之前的文章)。
盡管這篇論文的樣本量似乎還是少了點(diǎn),并且想強(qiáng)調(diào)的結(jié)論是1000hz以上的回報(bào)率對(duì)一些人來(lái)說(shuō)是可察覺(jué)的,但和本文的說(shuō)法其實(shí)不矛盾。下面提幾點(diǎn)值得注意的地方:
根據(jù)這篇文章引文里的結(jié)果,沒(méi)有人能在實(shí)驗(yàn)中分辨出20ms以下的點(diǎn)擊延遲,人是很難感受到1ms這個(gè)粒度的時(shí)間差異的。那為什么有人能分辨1000hz回報(bào)率和8000hz回報(bào)率的鼠標(biāo)呢?這可能是因?yàn)槭髽?biāo)指針在人眼里有超過(guò)1ms的視覺(jué)暫留,而這時(shí)屏幕就扮演了一個(gè)類(lèi)似打點(diǎn)計(jì)時(shí)器的角色,將時(shí)間上的微小抖動(dòng)放大成了空間上可見(jiàn)的抖動(dòng)。
可能只有少部分人能在360hz的顯示器上通過(guò)鼠標(biāo)指針的移動(dòng)分辨1000hz和8000hz的回報(bào)率,對(duì)大部分人來(lái)說(shuō)這個(gè)區(qū)別是難以察覺(jué)的。
按這篇論文的理論,1000hz以上的鼠標(biāo)回報(bào)率在144hz顯示器上可能是無(wú)法察覺(jué)的。
目前還沒(méi)有證據(jù)證明500hz以上的回報(bào)率能讓人在用指針點(diǎn)擊目標(biāo)的任務(wù)上有提升。打不中還是不能怪回報(bào)率。如果按人對(duì)點(diǎn)擊延遲的敏感程度要求每次點(diǎn)擊至少有20ms的時(shí)間窗口,那500hz確實(shí)不會(huì)有多少影響。
最后,提升鼠標(biāo)回報(bào)率確實(shí)可以改善本文中提到的每幀鼠標(biāo)回報(bào)總點(diǎn)數(shù)的穩(wěn)定性。
總而言之,在不超過(guò)360hz的顯示器上,1000hz的回報(bào)率可能對(duì)大部分人來(lái)說(shuō)都?jí)蛴昧?。這個(gè)夠用有兩個(gè)角度:一個(gè)是更高的回報(bào)率可能看不出區(qū)別;另一個(gè)是更高的回報(bào)率不會(huì)讓人有更好的操作表現(xiàn)。這里可能有一點(diǎn)違反大家的直覺(jué):看得出的區(qū)別不一定能導(dǎo)致操作表現(xiàn)的區(qū)別,目前的實(shí)驗(yàn)結(jié)果就是如此。
本文正文中的分析針對(duì)的主要是不同參數(shù)對(duì)操作表現(xiàn)的可能影響,也就是在控制其他變量的情況下,參數(shù)的改變會(huì)不會(huì)讓原來(lái)能打中的操作打不中了。至于人是否能感受到不同參數(shù)間的區(qū)別,能感受的區(qū)別到底是來(lái)自鼠標(biāo)回報(bào)率的提升,還是游戲幀率的降低,或是兩者兼有,這些在個(gè)體間可能差異很大,而目前實(shí)驗(yàn)結(jié)果有限,難以做一個(gè)定論。不過(guò)根據(jù)引文的統(tǒng)計(jì)結(jié)果,在不超過(guò)360hz的顯示器上,對(duì)1000hz以上回報(bào)率敏感的人可能是少數(shù)。
當(dāng)然,如果有其他更強(qiáng)有力的實(shí)驗(yàn)證明更高回報(bào)率的鼠標(biāo)會(huì)有對(duì)游戲表現(xiàn)有更顯著的提升,我也會(huì)考慮嘗試一下。(或者像這篇論文一樣讓雷蛇送一個(gè))