什麼是 N-key 與按鍵衝突?原理說明、改善技術、選購注意完全解析
不管是文書處理或遊戲中,我們都經常會使用到組合鍵,也就是多顆按鍵一起按下,執行某些特定的功能。有時候你可能會發現,明明只按下2顆鍵,再按下第3顆鍵時訊號卻沒有輸出。要是打報告到一半遇到這種狀況還好,如果在遊戲中遇到,那可能發生被大屠殺的慘劇。而造成這些情況產生,就是鍵盤的「鍵位衝突」(或稱「按鍵衝突」)所致。
再舉個簡單的例子,當在CS遊戲中拿著小刀要往斜後方行走時(按下S+D鍵或A+S鍵),這時看到敵人要切換武器(壓下數字鍵2或3),有些鍵盤就無法直接拿出武器,一定要放開行走的按鍵才能切換武器。這並不是遊戲的Bug,而是因為鍵盤內部先天性設計所產生的問題。
鍵位衝突不是卡鍵
鍵位衝突與卡鍵事實上是不相同的情況,許多人習慣以後者來形容鍵位衝突,而且在網路以訛傳訛的結果,就把這2種名詞變成同義了。事實上,「卡鍵」代表鍵帽壓下時陷在鍵盤內,彈不回來原有的位置,或者彈回來的時間比正常的時間還長,完全直接是照字面意思來解釋的。
結構、訊號雙管齊下
要認識什麼是鍵位衝突,就必須分2個部分來討論。第1部分得先了解鍵盤內部的構造,訊號是如何判斷與傳遞,以及遇到錯誤該如何避免;第2部分是探討如何將鍵盤訊號傳輸至電腦端,內在架構雖然不會造成鍵位衝突,但不同鍵盤的連接介面可能會造成影響,而無法順利將每個訊號送出。將2個部分整合起來,才能完全認識鍵位衝突原理。
非編碼鍵盤當道
鍵盤依轉換代碼來分類,可以分為編碼鍵盤與非編碼鍵盤2種。編碼鍵盤是指按下按鍵時,直接由數位電路上產生出ASCII碼,或者特別編碼來輸出。非編碼鍵盤則是將鍵盤按鍵排成矩陣形式(Keyboard Matrix),當按鍵觸發時,由鍵盤控制器(Keyboard Controller)依照行(Clown)與列(Row)的資訊,來查詢鍵盤碼表格,藉此找出使用者壓下的按鍵資訊並輸出。非編碼鍵盤的鍵盤碼表格較容易重新定義,結構技術不難。對於不同國家的鍵盤配置都容易進行鍵位設計,所以已經成為目前鍵盤主要的設計方式。
薄膜式鍵盤的行與列電路,會分散到鍵盤的2層薄膜電路上,而機械式則設計在PCB電路板上。這些行與列至少會由16條線路與8條線路交叉形成,組合出共有128個交叉點。目前鍵盤按鍵數大約為103鍵,就算語系不同按鍵數也不會相差太多,這128個點可以運用到目前所有的鍵盤。不過這種矩陣的設計方式代表壓下就會形成通路,如果一次壓下太多鍵,就有可能造成訊號誤判。
行與列判斷訊號
接下來,我們來看看是鍵盤訊號是如何偵測與送出。鍵盤的按鍵資訊都是設計在鍵盤矩陣中,裡面每個行與列的交錯點都代表著1顆按鍵資訊。當按鍵被觸發時,鍵盤就會進行掃描,查詢是哪顆鍵被壓下。首先會以行為單位會輪流掃描,之後再判斷是哪一列形成通路。
當單一按鍵被壓下時,鍵盤掃描行與列的原理非常簡單,很容易就會找到是哪顆鍵被壓下,立即就會將訊號送出,但如果同時觸發超過1顆按鍵時,則是另一種情況。鍵盤矩陣中最小矩形單位會是由4顆按鍵所組成,4顆鍵壓下任何1顆鍵都能順利輸出訊號。任意2顆鍵按下時,鍵盤控制器也能依行列資訊判斷是哪些鍵被觸發。當同時壓下1顆鍵與2顆鍵時,鍵盤很容易就能判斷訊號並將其送出。
產生Ghost Key
不過同時3顆鍵壓下時,就會送出2個行資訊與2個列資訊到鍵盤控制器。由於2行與2列共可形成4顆鍵,所以光靠行列資訊無法推算是4顆鍵中的哪3顆,而這時意外被導通電路的第4顆鍵,稱為Phantom Key(幽靈鍵)或Ghost Key(鬼鍵)。
Ghost Key出現時,控制器因無法判斷正確按鍵而產生錯誤的判斷資訊,為了避免錯誤訊號被送出,鍵盤控制器就會忽略第3顆壓下的訊號,只會輸出前2顆鍵一定正確的訊號。這就是目前使用者常會疑惑,明明已經壓下按鍵,為什麼電腦卻沒有送出訊號,其實就是因為產生Ghost Key發生鍵位衝突。
▲此為鍵盤矩陣簡化圖,在3行3列的電路中配有Q、W、E、A、S、D、Z、X、C鍵共9鍵。實際鍵盤矩陣不會如此簡單,會更為複雜。
▲當Q鍵壓下時:從C1開始掃描,R1有被導通電路,R2沒有,所以推論出C1R1被壓下。再從C2開始掃描,R1與R2都沒有形成通路。結論得到C1R1即Q鍵被觸發。
▲當Q、S鍵壓下時:從C1開始掃描,R1有被導通電路,R2沒有,所以推論出C1R1被壓下。再從C2開始掃描,R1沒有形成通路,R2有被導通電路,所以推論出C2R2被壓下。結論得到C1R1與C2R2即Q鍵、S鍵被觸發。
▲當Q、W、A鍵壓下時:從C1開始掃描,R1被導通電路,R2也被導通電路,所以推論出C1R1、C1R2都形成通路。再從C2開始掃描,R1被導通電路,此時R2透過C1也被導通電路,所以推論出C2R1、C2R2都形成通路。結論得到C1R1、C1R2、C2R1、C2R2即Q鍵、W鍵、A鍵、S鍵都被觸發,不過實際並不是如此。S鍵沒有按下卻意外被導通,此鍵就命名為Phantom Key,即Ghost鍵(鬼鍵)。
USB照樣能N-Key
目前鍵盤連接介面以PS/2與USB為主,而這2種介面的傳輸方式與內容都不相同。在前一單元有提到,鍵盤控制器(Keyboard Controller)由行列資訊查出是哪顆鍵被觸發後,就將按鍵資訊傳輸到電腦中。這只能算是簡略的說法,其實在這段過程中,鍵盤還做了許多事情。
隨時監控按鍵狀態
鍵盤控制器(Keyboard Controller)大部分時間都在掃描鍵盤矩陣,以及監控鍵盤是否有更動按鍵狀態。當按鍵被按下或將按鍵放開時,都會送一組掃描碼(Sacn Code)給電腦。這組掃描依不同情況分為2種:Make Code與Break Code。Make Code是在使用者按下按鍵時立即送出,Break Code是使用者放開按鍵時送出。這2種的內容都是獨一無二,方便給電腦主機能夠準確辨識之用。
先找出按鍵位置
送出Mack Code與Break Code訊號,得要先找到使用者是按下哪顆鍵才行。鍵盤無論採用何種鍵位配置,都會針對每一顆按鍵定義一個鍵盤號碼(Key Number)。當使用者壓下按鍵時,鍵盤控制器由行列資訊找出哪顆按鍵被壓下,再從鍵盤表中查出此按鍵位置所代表的是哪一個按鍵訊號。這中間過程無論是在PS/2介面或USB介面下都是相同的,但之後查表送出的訊號就有所不同了。
▲無論是101鍵與102鍵的按鍵配置,每個按鍵都會有1組按鍵號碼。
進行查表
知道按鍵位置之後,便會從Scan Codes Tables(掃描碼表格)中查詢Scan Codes(掃描碼)並送出訊號。其中Scan Codes Tables有分為Set 1、Set 2、Set 3共3組,一般系統預設是查詢Scan Codes Tables Set 2。
預設查表Set 2
在Scan Codes Tables Set 2中,鍵盤主要鍵位區Make Code每顆按鍵都是由1組8-bit位元碼(1Byte)組成,Break Code為2Bytes,其中Break Code第1個Byte皆為十六進位的F0,第2個Byte則與Mack Code相同。在主要鍵位區中,只有右側Ctrl鍵與右側Alt鍵不同,分別與左側Ctrl鍵與左側Alt鍵相比較,在Make Code部分多十六進位的E0,Break Code多十六進位的E0F0。
擴展功能鍵(Extended Keys)如鍵盤中間九宮格區(Insert、Delete等)、方向鍵區與右側數字鍵區,與Number Lock關閉時的右側數字鍵區功能重複。換句話說,因為擴展功能鍵常會隨著Shift鍵與Number Lock鍵的開啟與關閉而影響輸出結果,所以獨立定義出一組規則,不會與主要鍵位區相同。在Make Code會增加十六進位的E0,Break Code多出十六進位的E0F0。另外數字鍵區「/」、PrintScreen鍵、Pause鍵,這些也是有獨立的Make Code與Break Code表示。
電腦轉ASCII使用
當電腦接收到鍵盤所送出的掃描碼,會再轉成ASCII。最後這部分是由系統中驅動程式來完成,以便套用多國語系的設定。用PS/2介面的鍵盤運作狀況大致是如此,若用USB介面,就又是下面這種情況。
▲IBM技術參考手冊有將每一個按鍵的Make Code與Break Code一一條列出來。
USB HID限制6+2鍵
PS/2按鍵壓下與放開,是分Make Code與Break Code送出,而USB介面下則完全不同。依據USB HID(Human Interface Devices)規範,它是將正在壓下的按鍵訊號送出,沒有壓下按鍵的訊號就不送出。壓下的訊號按鍵每一次的封包為8 Bytes,其中2 Bytes 為Modifier Keys與Reserved保留鍵。
Modifier Keys為1Byte即8 bit,每一個bit可以記錄Shift、Ctrl、Alt、Windows鍵,左右側各有1顆鍵共8鍵。Reserved保留鍵可以做為Caps Lock、Number Lock、Scroll Lock等等鍵使用。扣除Modifier Keys與Reserved Keys之後,其他按鍵最多只有6鍵可以輸出。
USB鍵盤按鍵定義
▲由USB HID 1.11中可以明確看到USB鍵盤使用8 Bytes。
▲Reserved Keys保留鍵可以讓廠商做為多種用途。
▲Modifier Keys每1個bit各代表著不同按鍵訊號。
▲其他按鍵的訊號送出的定義也與Scan Codes Tables Set 2不同,USB有自己的一套查表,詳細可以查詢USB HID Uasage Tables。
訊號先進先出不打結
在USB HID中,我們真正可以使用的按鍵只有6鍵。如果按下超過6鍵,或者送出Ghost Key時,鍵盤便會送出錯誤訊息而停止。有些廠商在這裡的處理方式為採用FIFO(First In First Out,先進先出),當已經滿6顆訊號時,再讀取使用者新輸入的第7鍵訊號,就捨棄原本的第1鍵訊號,持續保持同時6鍵輸出。
▲USB按鍵送出範例:此範例以4 Bytes封包送出鍵盤訊號,其中1 Byte保留給Modifier Keys使用。如果鍵盤沒有動作時(None),送出的封包訊號與前一次相同。
解開HID封印可行
USB HID只是對USB設備設立的規範,USB裝置也能照著自己的規則走,所以USB鍵盤同時輸出6鍵還是可行,在這分享幾種USB鍵盤突破限制的方法。只是這些方法都需要付出額外的成本,早期鍵盤幾乎都是遵守USB HID規範,所以才會有許多人認為多鍵輸出在USB介面下是不可能的任務。
模擬多把鍵盤
但其實仍有辦法遵守USB HID規範,又能突破限制。最簡單的方法,就是利用鍵盤晶片,讓電腦在使用1把鍵盤情形下,誤認為同時連接多把鍵盤。就能將鍵盤按鍵,透過模擬的鍵盤分送訊號。原本限制的6顆鍵就能串聯起來,而重複的Modifier Keys與Reserved Keys位置,也能重新定義新按鍵送出,達成多顆鍵同時輸出。
此種方法穩定性較高,造成系統誤判的機率較低,許多鍵盤都採用這種方式。不過每多模擬1把鍵盤,至少就需要多1顆晶片,還要將晶片互接連接並將訊號分配控制,成本也隨之增加。通常採用此方法時會猜測玩家的按鍵需求,而非無上限地模擬鍵盤。
▲由作業系統的裝置管理員中,可以觀察到微軟SideWinder X4鍵盤模擬出2把鍵盤。
更改按鍵定義宣告
USB鍵盤變數宣告中,原本每Byte是代表著不同按鍵,但是可依需要重新宣告變數。每一個Byte分開成8 bits來計算,每1個bit各代表著1個按鍵,所以總共可以代表8個按鍵訊號。延伸至USB鍵盤原本8 Byte的訊號資料中,就可以代表著64顆鍵。搭配模擬多把鍵盤方式,只要模擬出第2把鍵盤就能有128個訊號,可滿足鍵盤全鍵輸出的需求。此種方法可以很容易在USB介面下達到全鍵輸出,打破介面的限制。
穩定性最重要
鍵盤相關的技術每年都會進步,要達到一樣的目標會有許多種技術,使用時通常也不會採用單一種方法,而是混合搭配。筆者無法針對每一種方法都加以詳細介紹,只能將比較常見的方法提出來討論研究。
雖然有些方法可以達到超過6鍵以上輸出,但是無法保證在每台電腦都能正常輸出。透過USB HUB等連接器時,鍵盤通常發生問題的機會較高。最後在市場鋪貨的鍵盤,多數都是將問題發生率降到最低,或者已有其他的配套方式可使用。無論如何,能夠讓玩家順利輸出鍵盤訊號才會是最重要的。
土砲自己的NKRO鍵盤
當然如果要靠自己力量,土砲出一把N-Key Rollover鍵盤不是難事。內部電路比較好去掌握,介面部分則較為複雜不易更動。國外有玩家自行購買二極體,然後再焊接於PCB電路板上,將鍵盤矩陣的電路加上跳線再加以改造,使得每個按鍵都能獨立送出訊號。這位玩家使用型號為1N4148的二極體,有興趣你也可以試試。
國外玩家做法
圖片來源網頁:http://geekhack.org/
▲圓圈代表按鍵,此圖為製作的重點。將按鍵獨立出來,並且焊上二極體。部分按鍵電路可依需要另外連接線路。
▲真正電路板上的按鍵訊號很複雜,判斷上不容易。首先要將按鍵獨立出來,所以部分電路板上需要先截斷電路。
▲然後再焊上二極體,與連接跳線。
▲全部完成後就製作出一把N-Key Rollover鍵盤。
看清產品真相
從市面上的產品規格不難觀察到,部分電競廠商會加入Anti-Ghosting標示,表示鍵盤能夠避免Ghost Key產生。但了解原理後,就能知道不是N-Key Rollover結構鍵盤,就會產生Ghost Key。
避免Ghost Key的方式都是將鍵盤矩陣進行最佳化處理,將常使用的遊戲按鍵畫出區隔,避免出現在同一個矩型內,減少鍵位衝突的機率。不過並非每家廠商都會註明鍵盤針對哪些按鍵有最佳化處理,加上每種遊戲會使用到的組合按鍵都不同,所以玩家可能還是會遇到鍵位衝突。
詳列按鍵最負責
認為光是註明Anti-Ghosting是不夠,應該將不會造成鍵位衝突的所有按鍵列出才是最負責的做法,也能讓玩家能清楚了解廠商所謂「最佳化鍵盤矩陣」的成果。目前有提出按鍵列表的是i-rocks的KR-6220G,這把薄膜式鍵盤針對Q、W、E、A、S、D、空白鍵與方向鍵共11顆鍵特別進行鍵位處理,將這些鍵避免設計在同一個鍵盤矩形中,能同時輸出11顆按鍵訊號並不衝突。因為是最多11顆鍵不衝突,所以i-rocks行銷宣傳時就是強調最多11顆鍵不衝突,而不是11-Key Rollover。
1種N-Key各自解讀
並不是每家廠商或店家都了解鍵位衝突的定義,除了常會解釋錯誤外,更有可能看到2-Key Rollover與N-Key Rollover表達以外的規格出現。如常見的會是6鍵、8鍵或10鍵,許多廠商對於這些鍵數定義都是以「最多」而不是「任意」,這應該直接以敘述方式表示而不是使用Rollover用詞。筆者更有遇過標示6 N-Key Rollover、Full N-Key Rollover,這種使用法錯得更是明顯。
注意鍵盤使用介面
由N-Key Rollover的定義可以知道,N代表著「任意同時可以處理的鍵數」,這句話與「同時可以處理最多的鍵數」是完全不一樣的。在早期PS/2時代時,稱為N-Key Rollover的鍵盤代表能全鍵輸出。而使用USB介面,就算內在使用N-Key Rollover架構設計,廠商如果沒有特別處理,便會受到USB HID規範影響而無法全鍵輸出。這時筆者認為能以6-Key Rollover來表示,事實上鍵盤的任意6鍵確實不會衝突,通常鍵盤在標示擁有N-Key Rollover功能時,都會標示使用介面以減少誤會。
各家計算按鍵數定義不同
廠商計算最多幾個按鍵送出,可能與我們的認知會有差距。如Modifier Keys保留雖然為1 Byte,不過可以送出8個按鍵訊號,所以要計算最大值是可以考慮進來。USB鍵盤的按鍵最多鍵輸出數量,會依廠商對於Modifier Keys採計數量標準不同,造成最後數據有所差異。例如微軟SideWinder X4可以同時最多輸出26鍵,分別為17個主要鍵位、7個Modifier Keys、1個多媒體鍵、1個巨集鍵。
測試按鍵衝突方法很多
目前有許多方法可以測試鍵盤是否有鍵位衝突問題,國外有付費軟體KeyboardTest,提供30天免費試用,之後如要再使用則要付24美元(約新台幣768元);國內則有玩家Ivan Lin開發出的hKBTEST免費軟體可供測試。
除了軟體測試外,最簡單的方法是開網頁就能測試。微軟在開發SideWinder X4時,提供了網頁平台,可以讓玩家利用網頁測試按鍵訊號。測試鍵位衝突時,建議針對遊戲常用的鍵先測試,如QWEASD或加入方向鍵等,小範圍比較容易注意到每個按鍵是否有順利送出,也可以注意是否送出玩家沒有壓下的按鍵。最後才是大範圍測試,計算鍵盤最多可以輸出幾個鍵。
▲微軟提供線上測試鍵位衝突問題,直接在網頁上就能即時測試出來。(測試網頁:http://www.microsoft.com/appliedsciences/KeyboardGhostingDemo.mspx)
N-Key Rollover功能運用
這是許多玩家心中的疑問:「1個人只有10隻手指頭,怎麼可能需要鍵盤訊號全部輸出呢?」把N-Key Rollover分成2種需求走向來討論。以「按鍵數量」來看,確實1個人使用時不大可能同時超過10鍵;但如果是2個人使用同一把鍵盤玩遊戲,全部訊號輸出就有可能派上用場。
近年來遊戲人口逐漸增加,漸漸會注意到鍵位衝突。即使最佳化處理過的鍵盤矩陣,還是有可能會有特定的按鍵會出問題。N-Key Rollover的鍵盤,代表著無論玩家按下任何組合鍵都不會造成鍵位衝突,可以適用在任何遊戲上,不需要擔心鍵盤是否會造成遊戲特定鍵無法發揮功能。筆者認為使用支援N-Key Rollover的鍵盤,就可以不用擔心會產生鍵位衝突問題。
▲i-rocks 6820E由於有註明特別優化的鍵位圖,在國外頗受好評。
什麼是 N-key 與按鍵衝突?原理說明、改善技術、選購注意完全解析的更多相关文章
- man page分類與說明
轉載自http://itzone.hk/article/article.php?aid=200407152225014657 (如有侵權,請留言或來信告知) 前言 Man page是每位程式設計員及U ...
- INSERT ... ON DUPLICATE KEY UPDATE产生death lock死锁原理
前言 编辑 我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用INSERT ... ON DUPLICATE K ...
- 淺析LED、LED背光、OLED的技術原理與區別
眼下很多廠商在推廣自己產品的時候都偷換了概念.明明是LED背光顯示器卻要簡稱為LED顯示器.事實上LED顯示器和目前的LED背光顯示器有著本質的區別.當然容易讓大家混淆的還有個技術非常先進的OLED. ...
- Gazebo與ROS版本說明
使用哪种ROS / Gazebo版本的组合 介绍 本文档提供了有关将不同版本的ROS与不同版本的Gazebo结合使用的选项的概述.建议在安装Gazebo ROS包装之前阅读它.重要!简单的分析,快速和 ...
- 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!
但是,也要注意, 为什么ctrl+shift_f有时候可以使用, 有时候又不可以使用? 是因为, 这个跟输入法的状态有关, 如果输入法是英文, 那么中文的 "简体/繁体切换快捷键ctrl+s ...
- X86 Booting Sequence
1.BIOS 0xFFFF0 電源正常啟動後,x86 CPU 會先執行 0xFFFF0,也就是 BIOS ROM 的進入點.由於 0xFFFF0 ~ 0xFFFFF 只有少的很可憐的 16 bytes ...
- JavaScript基礎知識
JavaScript基礎知識 1.標籤組使用 <script charset='utf-8' //設置字元集 defet //使腳本延遲到文檔解析完成,Browser已忽略 language=' ...
- VMware虛擬化技術實作問答
http://www.netadmin.com.tw/article_content.aspx?sn=1202130002&ns=1203280001&jump=3 Q4:啟用VMwa ...
- FCS校验 C语言简单实现
static uint8 calcFCS(uint8 *pBuf, uint8 len){ uint8 rtrn = 0; while (len--) { rtrn ^= *pBuf++; ...
随机推荐
- Font Rending 的 Hint 机制对排版的影响
Font Rending 的 Hint 机制对排版的影响[转] 在设计一种 Font 时,设计者使用的是一个抽象的单位,叫做 EM,来源于大写 M 的宽度(通常英文字体中大写 M 的宽度最大).EM ...
- CSS3匹配屏幕横竖状态
@media是css3中新定义的,功能非常强大,下面简单讲解一下用css3的@media orientation匹配手机屏幕是横屏还是竖屏. 顾名思义PC是无法匹配横竖屏的,所以orientation ...
- Custom.pm
1) 只有一种事情比你培训员工.培养员工然后他们离开要更糟糕,那就是你不培训他们.不培养他们,但他们仍然留下来. 2) PM的含义: Product Manager, Project Manager, ...
- unzip解压中文文件名乱码
由于中文的Windows使用的是GBK编码,而Linux默认使用UTF-8编码的,如果在Windows打包带中文文件的zip包,则这个zip包在Linux下面使用默认的归档管理器打开这个zip包的时候 ...
- 多个ORACLE HOME的情况,默认的ORACLE HOME是哪个,以及如何更改HOME
如果系统里安装了多个ORACLE产品,那么在注册表里,有可能也会有多个ORACLE HOME,在不设置系统环境变量的情况下,默认情况使用哪个ORACLE HOME? HKEY_LOCAL_MACHIN ...
- LeeCode-Happy Number
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- ZOJ 1008 Gnome Tetravex(DFS)
Gnome Tetravex Time Limit: 10 Seconds Memory Limit: 32768 KB Hart is engaged in playing an inte ...
- 【LeetCode练习题】Unique Paths II
Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are added to ...
- Installing — pylibmc 1.2.3 documentation
Installing - pylibmc 1.2.3 documentation libmemcached
- 三十三、Java图形化界面设计——布局管理器之null布局(空布局)
摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有 ...