根據情況不同,客戶端做的事情都有不同。
服務器至少要做驗證。
相對於網絡游戲來說,數據傳輸量在一定程度上可以忽略,而更注重數據來回時間。在一般情況下,比如說WOW里面,200MS延遲就開始變黃。也就是說在一般對時間要求不是很極端的,比如KOF97轉到MMO,200可以默認為一個普通MMO的標准線。
具體來說,理想上的網游,個人傾向於所有邏輯處理全放服務器端,而客戶端就像個媒體播放器。這是因為如同某本書講得,客戶端是掌握在對手手中,如果你讓服務器只起到數據交換作用,那么外掛就可以徹底糟蹋你的游戲。
在理想基礎上,客戶端要做的事就是表演,根據服務器和用戶的輸入處理,進行各種場景、動作與特效的播放。包括繪制角色(動態物件)、繪制場景(相對靜態物件)、繪制光照、物件、光照排序、動態物件動畫的播放。
當然這是基於理想基礎之上的,實際上的制作會有很多變化。比如休閑游戲,因為它要求響應比較迅速(比如泡泡堂,加速后的角色跑起來的速度飛快,你怎么保證其他客戶端能夠實時看到對方所在位置。不然就炸不到了),所以在這種需求之下,客戶端開始承接更多的活計,比如客戶端不單是播放功能,還加上了判斷,先執行了客戶端的判斷去追求表演的流暢性。當然,為了安全,最后數據一樣要通過服務器端驗證,驗證不通過就糾正回來。又因為糾正很粗暴,所以現在還開始增加一些糾正機制,讓糾正的過程看上去柔和些,比如WOW里面,有時候你會看到其他怪物或角色拖着速度線飛快的移動到其他地方,那就是柔和糾正機制。
用具體事例來說,舉個例子:聊天。一個游戲如此設定,一個玩家當使用“當前頻道”時,只能讓周圍50米的玩家收到。
於是。玩家A輸入了一堆話,這個時候客戶端接收,並立即發送到服務器端。
服務器端固定周期處理一次所有聊天信息,比如200毫秒,客戶端送到的時候,正好上一個200毫秒過去了,於是排在下一個200毫秒的隊列里。這個時候任何客戶端是沒辦法看到聊天信息的,包括A端(假定是這么設定的,這個就是有的時候你網絡卡的時候,明明按了回車,對話框卻不冒出任何聊天信息的原因)。
時間在流逝,服務器開始跑隊列,並跑到這個地方了,於是它開始運算,第一是判斷這句聊天對話是當前頻道、世界頻道還是其他,判定結果是當前,於是執行當前頻道的處理:讀取這個玩家所在位置,搜索這個位置方圓50米的其他玩家,向這些玩家包括A端廣播聊天信息(假如還有黑名單功能,還要剔除黑名單玩家;假如付費用戶字體還有特殊顏色,還要傳播這個對話的風格)。
所有客戶端收到信息,然后再聊天頻道里播放這條信息。於是大家都看到了。
而基本上這整個過程,包括玩家位置信息,包括玩家聊天內容,大小不可能超過1KB,就算是加密后。也就是這種數據量在正常情況下是可以忽略的。這個也是一般網絡游戲的傳輸數據量標准。更重要的是兩個參數,第一玩家信息包傳送到服務器並由服務器返回的時間;第二服務器處理事件的周期。
而除了UI位置這些瑣碎無關於角色的信息,其他信息都應該保存在服務器端。保存在客戶端的應該是資源,包括角色模型、動畫、場景、特效等,部分游戲也將大量文本保存在客戶端,比如任務對話。而重要信息,特別是任何將對自己或其他玩家有影響有改動的信息都應該放在服務器端。比如角色的經驗、甚至比如你接到的任務(如果你保存在客戶端,你換台機,以前接到的任務就都沒了)。
至於客戶端向服務器端什么時候發送消息,多少頻率,那一般是個長連接,只要信息量沒超過KB,影響都不太大。實際上,只要你登錄以后,服務器端和客戶端就一直在相互通信。哪怕你不動,服務器都會因為你有可能接受到聊天信息而不停的給你塞消息。所以這個還是讓程序去頭疼,他們是專業。
事情大體上就是這樣。