不管是文書處理或遊戲中,我們都經常會使用到組合鍵,也就是多顆按鍵一起按下,執行某些特定的功能。有時候你可能會發現,明明只按下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 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的二極體,有興趣你也可以試試。
看清產品真相
從市面上的產品規格不難觀察到,部分電競廠商會加入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由於有註明特別優化的鍵位圖,在國外頗受好評。