最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

震驚!游戲里的鼠標(biāo)加速竟要這樣關(guān)?!職業(yè)哥都不懂的游戲小妙招!

2023-02-25 20:38 作者:勉強(qiáng)上手  | 我要投稿

起源引擎游戲的社區(qū)里經(jīng)常能看到各種奇奇怪怪的鼠標(biāo)參數(shù)設(shè)置,時(shí)不時(shí)就能看到一兩個(gè)爆款視頻發(fā)現(xiàn)新的“隱藏參數(shù)”。

為什么有這么多參數(shù)?哪些參數(shù)有用?由于V社起源引擎的游戲代碼在各個(gè)時(shí)期有過多次完整的泄露,我們可以從源代碼完全搞清楚這些亂七八糟的參數(shù)是怎么來的,到底有什么作用。

根據(jù)我讀過的代碼,大部分視頻都是胡說八道,但居然也能火。

好為人師的我急了,寫一點(diǎn)根據(jù)告訴大家:游戲選項(xiàng)里的原始輸入就是真正的原始輸入,瞎加參數(shù)反而可能會(huì)引入爆款視頻里深惡痛絕的Windows鼠標(biāo)加速。

當(dāng)然,可能還是有很多人不信邪,油鹽不進(jìn)。

如果在你的認(rèn)知里,游戲的邏輯是由源代碼決定的,你又恰巧看得懂C++,那完全可以照著我的根據(jù)自己驗(yàn)證一下。

如果在你的認(rèn)知里,除了源代碼,游戲邏輯還受一些說不清道不明的玄學(xué)控制,那這篇文章就不用看了。

由于這些參數(shù)實(shí)在沒什么意思,我也就懶得好好組織了,嫌太長(zhǎng)或者看不下去的可以直接看最后的總結(jié)。


起源引擎中的兩種參數(shù)

在游戲啟動(dòng)選項(xiàng)中我們見過兩種參數(shù),一種以"-"開頭,一種以"+"開頭,它們對(duì)應(yīng)的是起源引擎中的兩種參數(shù)。

  • "-"開頭的參數(shù)是命令行參數(shù),只能在啟動(dòng)選項(xiàng)中添加。

  • "+"開頭的參數(shù)是起源引擎的控制臺(tái)參數(shù),可以在啟動(dòng)選項(xiàng)中修改,也可以通過cfg文件修改,也可以在游戲中的控制臺(tái)里修改。

感興趣的參考developer.valvesoftware.com/wiki/Command_Line_Options。


早期的起源引擎

早期的起源引擎是從Quake的游戲源代碼改出來的,那個(gè)時(shí)代的Windows沒有提供獲取鼠標(biāo)原始輸入數(shù)據(jù)的方式,從鼠標(biāo)的原始數(shù)據(jù)到游戲視角轉(zhuǎn)動(dòng)大概經(jīng)歷了這么一個(gè)流程:

鼠標(biāo)將移動(dòng)的原始數(shù)據(jù)發(fā)送給Windows

-> Windows根據(jù)鼠標(biāo)原始數(shù)據(jù)和Windows鼠標(biāo)設(shè)置的參數(shù)(可以用m_mousespeed, m_mouseaccel1和m_mouseaccel2來設(shè)置)計(jì)算鼠標(biāo)指針的位移

-> 游戲引擎讀取指針的當(dāng)前坐標(biāo),減去屏幕中心坐標(biāo)得到指針的XY偏移量,然后把指針歸位到屏幕中心

-> 游戲引擎根據(jù)指針的XY偏移量、靈敏度(sensitivity)、游戲鼠標(biāo)加速參數(shù)(m_customaccel*)、m_yaw(可以看我之前的文章)、m_pitch(豎直方向的m_yaw)等參數(shù)計(jì)算得到視角轉(zhuǎn)動(dòng)的角度

-> 根據(jù)轉(zhuǎn)動(dòng)角度更新視角


這一流程可以簡(jiǎn)單概括為:

鼠標(biāo)原始數(shù)據(jù)->指針移動(dòng)距離->視角轉(zhuǎn)動(dòng)角度


其中,[鼠標(biāo)原始數(shù)據(jù)->指針移動(dòng)距離]這一過程受Windows鼠標(biāo)設(shè)置直接影響(Windows的設(shè)置可以通過游戲設(shè)置更改),[指針移動(dòng)距離->視角轉(zhuǎn)動(dòng)角度]這一過程受游戲設(shè)置直接影響。


這兩個(gè)過程中都可以引入鼠標(biāo)加速,因此起源引擎中有兩套和鼠標(biāo)加速相關(guān)的參數(shù):

  • 對(duì)發(fā)生在Windows里的 [鼠標(biāo)原始數(shù)據(jù)->指針移動(dòng)距離]:m_mousespeed, m_mouseaccel1和m_mouseaccel2用來設(shè)置與Windows鼠標(biāo)指針加速相關(guān)的參數(shù),也就是注冊(cè)表HKEY_CURRENT_USER\Control Panel\Mouse位置的MouseSpeed, MouseThreshold1和MouseThreshold2

  • 對(duì)發(fā)生在起源引擎里的?[指針移動(dòng)距離->視角轉(zhuǎn)動(dòng)角度]:m_customaccel開頭的參數(shù)用來設(shè)置游戲引擎中的鼠標(biāo)加速


早期Windows鼠標(biāo)指針加速的完整邏輯是(參考systemmanager.ru/win2k_regestry.en/34683.htm):

  • 當(dāng)鼠標(biāo)回報(bào)點(diǎn)數(shù)小于MouseThreshold1時(shí),指針移動(dòng)距離就是鼠標(biāo)回報(bào)點(diǎn)數(shù)

  • 當(dāng)鼠標(biāo)回報(bào)點(diǎn)數(shù)在MouseThreshold1和MouseThreshold2之間時(shí),指針移動(dòng)距離*2

  • 當(dāng)鼠標(biāo)回報(bào)點(diǎn)數(shù)達(dá)到MouseThreshold2時(shí),指針移動(dòng)距離*4


MouseThreshold是否起效受到MouseSpeed控制:

  • MouseSpeed = 0時(shí)兩個(gè)MouseThreshold都不起效,指針移動(dòng)距離就是鼠標(biāo)回報(bào)點(diǎn)數(shù)

  • MouseSpeed = 1時(shí)只有MouseThreshold1起效,鼠標(biāo)回報(bào)點(diǎn)數(shù)超過MouseThreshold1時(shí)指針移動(dòng)距離翻倍

  • MouseSpeed = 2時(shí)MouseThreshold1和MouseThreshold2都起效,鼠標(biāo)回報(bào)點(diǎn)數(shù)超過MouseThreshold1時(shí)指針移動(dòng)距離翻倍,超過MouseThreshold2時(shí)指針移動(dòng)距離乘四


可見,只要把m_mousespeed設(shè)置為0,Windows鼠標(biāo)加速就會(huì)被起源引擎關(guān)掉。


起源引擎[指針移動(dòng)距離->視角轉(zhuǎn)動(dòng)角度]中的鼠標(biāo)加速邏輯說起來就比較復(fù)雜,概括一下大家想知道的:只要把m_customaccel設(shè)置成0,其他m_customaccel開頭的參數(shù)都會(huì)失效,起源引擎此時(shí)不會(huì)引入鼠標(biāo)加速。


更多的故事可以參考www.hltv.org/forums/threads/391206/m-mousespeed-1-or-0#r4945460中的35樓。

對(duì)起源引擎自帶的鼠標(biāo)加速邏輯感興趣的可以看github.com/nillerusr/source-engine/blob/master/game/client/in_mouse.cpp中的ScaleMouse和ApplyMouse函數(shù)。


現(xiàn)在的起源引擎

后來,Windows的鼠標(biāo)加速邏輯變了,起源引擎的默認(rèn)邏輯也跟著變了。


Windows的鼠標(biāo)加速邏輯變成了用控制面板中的“提供指針精確度”開關(guān),根據(jù)一個(gè)加速曲線來控制指針移動(dòng)的距離,不再是原來那種把指針移動(dòng)距離乘二和乘四的簡(jiǎn)單邏輯了,MouseSpeed、MouseThreshold1和MouseThreshold2的意義也變了。


由于MouseSpeed這個(gè)參數(shù)在缺少信息的年代被起源引擎的某個(gè)開發(fā)者理解錯(cuò)了(可以參考上面hltv里的故事),現(xiàn)在的起源引擎默認(rèn)是忽略m_mousespeed, m_mouseaccel1和m_mouseaccel2這三個(gè)參數(shù)的。但為了兼容性,在啟動(dòng)項(xiàng)中加入"-useforcedmparms"時(shí)還是會(huì)根據(jù)這三個(gè)參數(shù)修改Windows的MouseSpeed、MouseThreshold1和MouseThreshold2,其中:

- 如果只有"-useforcedmparms"這一啟動(dòng)項(xiàng),則會(huì)把MouseSpeed改成m_mousespeed,把MouseThreshold1改成m_mouseaccel1,把MouseThreshold2改成m_mouseaccel2。

- 如果除了"-useforcedmparms"以外還加入了"-nonoforcemspd",則不會(huì)修改MouseSpeed,也就是忽略m_mousespeed

- 如果除了"-useforcedmparms"以外還加入了"-nonoforcemaccel",則不會(huì)修改MouseThreshold*,也就是忽略m_mouseaccel*

- 如果沒有"-useforcedmparms",則m_mousespeed, m_mouseaccel*都會(huì)被忽略


由此可見,不加"-useforcedmparms"的情況下這三個(gè)參數(shù)就會(huì)被忽略,什么事都沒有,加了反而可能啟用Windows的鼠標(biāo)指針加速。


感興趣的參考github.com/nillerusr/source-engine/blob/master/game/client/in_mouse.cpp中的Init_Mouse函數(shù)。


另外,由于Windows現(xiàn)在提供了讀取鼠標(biāo)原始輸入的接口GetRawInputData,起源引擎加入了新的選項(xiàng)m_rawinput來跳過指針數(shù)據(jù)這一步。當(dāng)m_rawinput為1時(shí),從鼠標(biāo)的原始數(shù)據(jù)到視角轉(zhuǎn)動(dòng)的流程變?yōu)椋?/p>

鼠標(biāo)將移動(dòng)的原始數(shù)據(jù)發(fā)送給Windows

-> 游戲引擎通過GetRawInputData讀取鼠標(biāo)發(fā)送的原始數(shù)據(jù),作為XY偏移量

-> 游戲引擎根據(jù)指針的XY偏移量、靈敏度(sensitivity)、游戲鼠標(biāo)加速參數(shù)(m_customaccel*)、m_yaw、m_pitch等參數(shù)計(jì)算得到視角轉(zhuǎn)動(dòng)的角度

-> 根據(jù)轉(zhuǎn)動(dòng)角度更新視角


可以簡(jiǎn)單概括成:

鼠標(biāo)原始數(shù)據(jù)->視角轉(zhuǎn)動(dòng)數(shù)據(jù)


可見,當(dāng)m_rawinput為1時(shí),指針移動(dòng)距離這一步被跳過了,因此與Windows鼠標(biāo)指針相關(guān)的參數(shù)m_mousespeed, m_mouseaccel1, m_mouseaccel2全都沒用,此時(shí)控制面板的鼠標(biāo)設(shè)置也對(duì)游戲完全沒影響。


感興趣的參考github.com/nillerusr/source-engine/blob/master/game/client/in_mouse.cpp中的GetAccumulatedMouseDeltasAndResetAccumulators函數(shù)和github.com/nillerusr/source-engine/blob/master/inputsystem/inputsystem.cpp中的GetRawMouseAccumulators函數(shù)。


CSGO和Apex中的實(shí)驗(yàn)

由于泄露的源代碼不是現(xiàn)在的源代碼,Apex的引擎也和原版起源引擎不太一樣,最好能做實(shí)驗(yàn)看看指針數(shù)據(jù)這一步是不是真的被跳過了。


我寫了個(gè)簡(jiǎn)單的python腳本模擬Windows指針的運(yùn)動(dòng)。

  • 如果游戲還是通過指針數(shù)據(jù)轉(zhuǎn)動(dòng)視角,那這個(gè)腳本應(yīng)該能讓游戲視角轉(zhuǎn)動(dòng)。

  • 如果游戲跳過了指針數(shù)據(jù),通過鼠標(biāo)原始數(shù)據(jù)轉(zhuǎn)動(dòng)視角,那這個(gè)腳本應(yīng)該就不能讓游戲視角轉(zhuǎn)動(dòng)。

????import pyautogui

????import time

????

????while True:

????? ? x, y = pyautogui.position()

????? ? pyautogui.moveTo(x+100, y)

????? ? print(x, y)

????? ? time.sleep(0.5)

????? ? x, y = pyautogui.position()

????? ? pyautogui.moveTo(x-100, y)

????? ? time.sleep(0.5)

????? ? pyautogui.click()

????? ? time.sleep(0.5)

????

這段腳本做的就是讓指針每隔0.5秒左右移動(dòng)100的距離,然后按一下左鍵??梢栽赪indows的命令行中用python運(yùn)行這段腳本,再切換到游戲里看效果。


在CSGO中可以發(fā)現(xiàn),當(dāng)設(shè)置m_rawinput 0時(shí),這段腳本既可以移動(dòng)視角,也能開槍,說明此時(shí)游戲的視角轉(zhuǎn)動(dòng)是被指針數(shù)據(jù)控制的。當(dāng)設(shè)置m_rawinput 1后,這段腳本就不會(huì)轉(zhuǎn)動(dòng)視角,只會(huì)開槍了。會(huì)開槍說明這段腳本生效了,不能轉(zhuǎn)動(dòng)視角說明此時(shí)游戲用的不是指針數(shù)據(jù),而是鼠標(biāo)原始數(shù)據(jù)。


盡管Apex是基于起源引擎開發(fā)的,但通過r5reloaded客戶端的控制臺(tái)我們可以發(fā)現(xiàn)Apex的控制臺(tái)參數(shù)和起源引擎有很大的不同。如Apex中的靈敏度參數(shù)是mouse_sensitivity,CSGO中是sensitivity;Apex中沒有m_mousespeed, m_rawinput等控制臺(tái)參數(shù);Apex中注釋為"Mouse acceleration"的參數(shù)m_acceleration在起源引擎中是服務(wù)端用來控制移動(dòng)加速的(參考github.com/nillerusr/source-engine/blob/master/game/server/triggers.cpp)。鑒于Apex的m_acceleration默認(rèn)為0,在r5reloaded客戶端的控制臺(tái)中我們也找不到其他和鼠標(biāo)相關(guān),名字帶accel的參數(shù),我認(rèn)為Apex游戲本身默認(rèn)是不帶鼠標(biāo)加速的。那Apex用的是指針數(shù)據(jù),還是鼠標(biāo)原始數(shù)據(jù)呢?通過運(yùn)行上面的腳本我們可以發(fā)現(xiàn),在Apex中移動(dòng)指針是不會(huì)轉(zhuǎn)動(dòng)視角的,因此Apex應(yīng)該是直接用了鼠標(biāo)的原始數(shù)據(jù),把m_rawinput這個(gè)開關(guān)參數(shù)去掉了。


上面的實(shí)驗(yàn)還有一個(gè)丐版。我們知道控制面板的"選擇指針移動(dòng)速度"是可以更改指針?biāo)俣鹊?,我們只要把控制面板?#34;選擇指針移動(dòng)速度"分別拉到最低和最高,看對(duì)游戲有沒有影響就知道游戲用的是不是指針數(shù)據(jù)了。不會(huì)python的可以在CSGO里把m_rawinput分別改成0和1自己試試,這個(gè)改法最快和最慢的指針?biāo)俣戎g差了112倍(參考liquipedia.net/counterstrike/Mouse_Settings),比爆款視頻里若有若無的心理暗示高到不知道哪里去了。


總結(jié)

  • CSGO中想要沒有加速的原始鼠標(biāo)輸入,只要設(shè)置m_rawinput 1和m_customaccel 0就行了,不要閑著沒事在啟動(dòng)選項(xiàng)加-useforcedmparms。

  • Apex啥也不用加,有強(qiáng)迫癥的可以確認(rèn)一下自己的config里m_acceleration是不是0。

  • 鑒于在現(xiàn)代的Windows里獲取鼠標(biāo)原始輸入是如此的簡(jiǎn)單,在新出的FPS游戲里,只要有鼠標(biāo)原始輸入的選項(xiàng)選上就行了。

最后,在這個(gè)問題上職業(yè)選手的參數(shù)沒有參考價(jià)值,職業(yè)哥真不懂。


震驚!游戲里的鼠標(biāo)加速竟要這樣關(guān)?!職業(yè)哥都不懂的游戲小妙招!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
习水县| 堆龙德庆县| 东乌| 深水埗区| 丰都县| 留坝县| 托里县| 炉霍县| 淮北市| 疏附县| 正镶白旗| 贵定县| 太谷县| 陵川县| 琼海市| 青海省| 封丘县| 康乐县| 和田县| 兰西县| 鞍山市| 玛纳斯县| 多伦县| 东辽县| 白玉县| 双辽市| 蒙自县| 色达县| 休宁县| 利津县| 平乐县| 常德市| 永德县| 全椒县| 彰化市| 灵台县| 阳信县| 盐津县| 明星| 内乡县| 稻城县|