2010年9月19日 星期日

透過網路工程師的角度,看遊戲設計的原則(上)

SEGA第三CS開發部的技術總監節政暁生さん,在今年的CEDEC上主講了一場「網路連線運作與遊戲設計」為題的研討會。以下分別是4GamerGameWatch的專題報導連結。

本文是參考這兩篇報導,再加上一些簡單補充寫成的。



 研討會目的

解說製作連線遊戲時會受到的制約。
解說各種不同的遊戲連線運作方式。
思考在遊戲製作上必須考慮到哪些東西。
將這些技術應用於今後的遊戲上。(網路遊戲連線的技術早在2000年左右就已經成熟了)



 避不掉的LAG問題

連線遊戲的最大敵人莫過於Lag。

Lag的狀況分為以下三種:
◎ 延遲(速度太慢):會讓畫面停頓一段時間。
◎ 頻寬不足:玩家所下達的指令送不出去。
◎ 封包遺失:造成不同步甚至斷線。



 連線遊戲的網路通訊協定

不同的網路連線方式(此連線方式被稱為「通信協定」),也會需要面對不同的連線問題。因此不同類型的連線遊戲,很可能會採取不同的連線方式 。

◎ UDP(User datagram protocol):
運作模式是「射後不理」。把想送出的資料寫上收件人的名字以後,丟進茫茫網海之中,就再也不管了。處理速度較快,也省頻寬,但會有收件人收不到資料的危險性。

◎ TCP(Transmission control protocol):
運作模式是「一往一復」。傳送資料後,收信方會給發信方一個回應(ack);所以當封包漏送時,發信方也能重新再送一次。處理速度慢,因此在某些特別要求速度的狀況下會遇到瓶頸。(如格鬥遊戲)

◎ RUDP(Reliable UDP):
兼具兩者優點的折衷型。速度快,而且沒有漏失資料的危險。目前為止並不是個正式規格,因此也沒經過標準化。性能依規格不同而相異。實作上的應用方式,下面段落會再說明。

以下是一些特性的整理對照。
通訊方式UDPTCPRUDP
封包遺失可能不會發生不會發生
封包是否照順序不一定視規格而定
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個指令的職業級玩家,也不需要頻繁地傳送資料。(因為一個封包可以容納許多指令)

除此之外,為了減低傳送的頻率,但又不想讓玩家感受到延遲;有些遊戲甚至在單機模式裡,也偷偷加入指令延遲時間,好讓玩家能在連線時完全感受不到差異性。

(待續)

沒有留言: