高回報(bào)率鼠標(biāo)在Windows似乎會(huì)丟數(shù)據(jù),大家來測(cè)測(cè)
更新:換了新電腦和最新版Win11以后似乎沒問題了。建議用高回報(bào)率鼠標(biāo)前更新到最新版Win11,并且用mousecomparator和低回報(bào)率鼠標(biāo)對(duì)比一下看穩(wěn)不穩(wěn)定。
測(cè)了下剛到的VGN 4khz接收器,在開2khz和4khz回報(bào)率的時(shí)候dpi不穩(wěn)定,但在1khz下正常,不知道是丟包了還是測(cè)試方法有問題。
我在1600dpi下用機(jī)器左右移動(dòng)2英寸測(cè)得的結(jié)果是這樣的:




測(cè)試工具是github.com/benkyoujouzu/mousesniff。測(cè)試結(jié)果上的橫軸是時(shí)間,縱軸類似于mousetester里的xsum,是開始測(cè)試以來鼠標(biāo)回報(bào)x點(diǎn)數(shù)的總和。理論上說,1600dpi下移動(dòng)2英寸應(yīng)該回報(bào)3200個(gè)點(diǎn),可以看到1khz的測(cè)試結(jié)果下鼠標(biāo)每次移動(dòng)都回報(bào)了大約3200個(gè)點(diǎn),但是4khz和2khz下回報(bào)的點(diǎn)數(shù)不到3000個(gè),少了很多點(diǎn),而且波動(dòng)很大。用mousetester也能測(cè)出類似的結(jié)果。
考慮到大部分讀者都沒有機(jī)器,下面介紹一個(gè)用手測(cè)的方法,用到的工具是mousecomparator。www.overclock.net/threads/mousecomparator.1570462/
mousecomparator的測(cè)試步驟
0.?把vgn和對(duì)比鼠標(biāo)調(diào)到相同的dpi
1.?用vgn鼠標(biāo)點(diǎn)Mouse?1
2.?用對(duì)比鼠標(biāo)點(diǎn)Mouse?2
3.?按F1開始收集數(shù)據(jù),把兩個(gè)鼠標(biāo)同時(shí)橫向拖動(dòng)相同的距離(就移動(dòng)一次,不要來回晃)
4.?按F2停止收集數(shù)據(jù)
5.?點(diǎn)Calculate計(jì)算兩個(gè)鼠標(biāo)回報(bào)距離的比例,應(yīng)該接近1.0

試試vgn不同回報(bào)率下的結(jié)果,我在1khz回報(bào)率下結(jié)果很接近1.0,但4khz回報(bào)率下結(jié)果在0.6-0.85波動(dòng)。



這意味著4k hz下dpi會(huì)有很大的波動(dòng),類似于加了個(gè)Sensitivity Randomizer。
最后,不管是mousesniff,mousetester還是mousecomparator用的都是GetRawInputData這個(gè)api獲取鼠標(biāo)數(shù)據(jù),我不太確定這個(gè)api是不是在超過1khz回報(bào)率的時(shí)候會(huì)出問題,不過起源引擎(至少在之前泄露出來的版本)就是用的這個(gè)api。
發(fā)這篇文章主要是希望有其他高回報(bào)率鼠標(biāo)的讀者也嘗試一下上面這個(gè)mousecomparator的測(cè)試,試試有沒有類似的現(xiàn)象,看看是api的問題還是鼠標(biāo)或者接收器的問題。(更新:看來更可能是API問題)
230522更新:
看到一個(gè)帖子說GetRawInputData在高回報(bào)率可能會(huì)出問題。( forum.unity.com/threads/windows-mouse-raw-input-mouse-handling-broken-in-rewired.1172786/ )
于是嘗試用GetRawInputBuffer實(shí)現(xiàn)了一個(gè)讀原始數(shù)據(jù)的東西,發(fā)現(xiàn)2khz回報(bào)率下幾乎沒問題了,但是4khz回報(bào)率下仍然會(huì)丟包。一個(gè)合理的猜測(cè)是windows在處理不過來的時(shí)候會(huì)把輸入的數(shù)據(jù)丟掉。
(用GetRawInputBuffer的實(shí)現(xiàn) github.com/benkyoujouzu/mousesniff/releases/download/v0.0.0-alpha.0-buf/mousesniff-v0.0.0-alpha.0-buf.exe)
用了GetRawInputBuffer,2khz在508mm/s也沒太大問題,

4khz在64mm/s左右的速度時(shí)基本也沒問題

但是在127mm/s以上就開始少量地丟數(shù)據(jù)了

254mm/s以上丟數(shù)據(jù)就比較明顯了。


就目前的結(jié)果來看,丟數(shù)據(jù)的原因更可能是API或者電腦性能的問題,建議大家在fps游戲里暫時(shí)還是用1khz回報(bào)率,因?yàn)椋?/p>
有讀者反饋其他的高回報(bào)率鼠標(biāo)在用GetRawInputData的mousecomparator上也會(huì)出問題。
我暫時(shí)沒有找到比GetRawInputBuffer更好的辦法,而且考慮到很多開源的游戲引擎都還在用效果更壞的GetRawInputData,很多游戲可能也還在用GetRawInputData,這個(gè)API在2khz回報(bào)率都會(huì)明顯丟數(shù)據(jù)。
雖然我的CPU比較一般,但測(cè)試是在cpu空閑的時(shí)候進(jìn)行的,實(shí)際游戲的時(shí)候cpu的壓力會(huì)更大,即使是比較好的CPU也有可能出現(xiàn)類似的問題。
當(dāng)然也還不能完全排除:
我代碼寫搓了
鼠標(biāo)或者接收器有問題
有條件的讀者可以拿其他有線的高回報(bào)率鼠標(biāo)試試。
230526更新:
根據(jù)讀者的建議把CPU的c-state禁用了,用GetRawInputBuffer獲取4k數(shù)據(jù)即使在高速也沒問題了,不過GetRawInputData還是和之前一樣丟數(shù)據(jù)。

依然建議大家在fps游戲里暫時(shí)還是用1khz回報(bào)率,根據(jù)我的測(cè)試,在我的電腦上4khz和2khz在用144hz的幀數(shù)累加(見github.com/benkyoujouzu/mousesniff 說明)以后并沒有比1khz更好。



