本文是參考這兩篇報導,再加上一些簡單補充寫成的。
研討會目的
解說製作連線遊戲時會受到的制約。
解說各種不同的遊戲連線運作方式。
思考在遊戲製作上必須考慮到哪些東西。
將這些技術應用於今後的遊戲上。(網路遊戲連線的技術早在2000年左右就已經成熟了)
避不掉的LAG問題
連線遊戲的最大敵人莫過於Lag。
Lag的狀況分為以下三種:
◎ 延遲(速度太慢):會讓畫面停頓一段時間。
◎ 頻寬不足:玩家所下達的指令送不出去。
◎ 封包遺失:造成不同步甚至斷線。
連線遊戲的網路通訊協定
不同的網路連線方式(此連線方式被稱為「通信協定」),也會需要面對不同的連線問題。因此不同類型的連線遊戲,很可能會採取不同的連線方式 。
◎ UDP(User datagram protocol):
運作模式是「射後不理」。把想送出的資料寫上收件人的名字以後,丟進茫茫網海之中,就再也不管了。處理速度較快,也省頻寬,但會有收件人收不到資料的危險性。
◎ TCP(Transmission control protocol):
運作模式是「一往一復」。傳送資料後,收信方會給發信方一個回應(ack);所以當封包漏送時,發信方也能重新再送一次。處理速度慢,因此在某些特別要求速度的狀況下會遇到瓶頸。(如格鬥遊戲)
◎ RUDP(Reliable UDP):
兼具兩者優點的折衷型。速度快,而且沒有漏失資料的危險。目前為止並不是個正式規格,因此也沒經過標準化。性能依規格不同而相異。實作上的應用方式,下面段落會再說明。
以下是一些特性的整理對照。
通訊方式 | UDP | TCP | RUDP |
封包遺失 | 可能 | 不會發生 | 不會發生 |
封包是否照順序 | 不一定 | 是 | 視規格而定 |
Header資料大小 | 小 (28bytes) | 大 (40bytes) | 視規格而定 |
處理速度 | 快 | 慢 | 快 |
NAT問題 | 容易發生 | 不易發生 | 容易發生 |
◎ Header:
資料封包的開頭部分,記載了整個封包的相關資訊(包含資料長度、IP等)。
不管封包大小如何改變,只要通訊協定相同,Header大小就是固定的。
◎ NAT(Network address translation)問題:
會造成資料無法送達目的。
格鬥遊戲的連線運作方式:
完全即時同步,透過玩家按鈕資料來同步
格鬥遊戲因為擁有最高等級的動作性,因此連線的同步要求也格外嚴格。
以Virtua Fighter 5(60FPS,每秒60張動畫)的網路對戰為例,是以「雙方螢幕完全同步顯示」為前提製作的。
首先解釋一下VF5的連線同步概念:
◎ 使用UDP通訊協定傳送資料。(用UDP速度較快)
--傳送「搖桿跟按鍵的輸入內容」給對方,再用此資料來進行同步。
◎ 每次都會傳送最新10筆「按鍵輸入」的資料。(也就是說,每筆會被傳送10次)
--將「按鍵輸入」資料被「UDP通訊協定」搞丟的機率降到最低。
除此之外,還有一道最後防線,以防UDP真的連續搞丟10個封包:
◎ 每秒會用RUDP進行一次同步。(RUDP是不會搞丟封包的)
--送出這一秒內的所有按鍵輸入內容,補齊所有缺漏的「按鍵輸入」資料。
接著說明RUDP的實作概念。
若想要確保封包不會遺失,關鍵在於發信方必須知道「封包是否有被收到」。
在TCP通訊協定中,受信方在收到封包後,會回傳收信回應(Ack),告知「封包收到了」。發信方在送出資料一段時間之後,如果還沒有收到回應,就會再傳一次資料--直到資料收到為止。
VF5的RUDP則是利用以下的方式,達到收信回應(Ack)的效果。
◎ 將每筆資料封包都標上一個流水號,這個數字代表了時間順序。
--如此一來,受信方就知道「哪些封包收到了」以及「幾號封包還沒有收到」。
而受信方知道了之後要如何通知發信方呢?「下一次傳送資料」的時候,就是最好時機。
◎ 每筆資料封包中,額外夾帶另一個「收信回應」號碼。
--這個數字則是代表「這個編號之前的所有封包,我都已經收到了」。
如此一來,就能重新傳送沒被收到的封包,而不會漏掉任何一個封包了。
(順便一提,這兩個流水號碼就是記錄在Header裡面)
即時戰略的連線運作方式:
完全即時同步,透過傳送指令資料來同步
即時戰略與格鬥遊戲相同,都需要做到「完全即時同步」。
其中略有不同的是,用來同步的資料內容--由於遊戲性質的差異,即時戰略必須更進一步,將原始的操作輸入濃縮成一個個的「指令」。
以星海爭霸舉例,傳送的資料大概可以看成這樣:
傳送這樣的指令,除了資料量非常少之外,頻率也不需要太高。即使是每分鐘可以下達200、300個指令的職業級玩家,也不需要頻繁地傳送資料。(因為一個封包可以容納許多指令)
除此之外,為了減低傳送的頻率,但又不想讓玩家感受到延遲;有些遊戲甚至在單機模式裡,也偷偷加入指令延遲時間,好讓玩家能在連線時完全感受不到差異性。
(待續)
沒有留言:
張貼留言