## 關於手游客戶端網絡壓力的一些思考
### 場景背景
毫無疑問,策划都喜歡多人同屏戰斗。什么萬人大地圖,這肯定是策划的最愛了。可是對於游戲來說,這並不是什么非常好的設計。即使解決了服務端計算的性能壓力,客戶端顯示的性能壓力。萬萬沒想到的是我們游戲在客戶端網絡帶寬上面遇到了壓力。
假設1000人同屏,那么要同時同步1000個人的位置,移動方向,速度,釋放技能,傷害,血量,buff等信息。這n^2的網絡帶寬復雜度,對於服務端來說,其實只要申請大些的帶寬,買貴點其實就可以解決了。但是對於時常處於不穩定和低網速網絡環境(電梯、地鐵、偏遠山區等環境)下的手機,特別是還處於2g,3g的網絡環境下的手機,那么小的帶寬承載能力其實根本無法應付這么大的網絡消息同步的。造成后果,游戲會有明顯的收包卡頓,有些會出現好幾秒,出現非常不好的游戲體驗。
另外,即使手機可以承受,在當下手機網絡流量並沒有那么廉價的情況下,如此耗費網絡流量,很難的得到玩家的承受。
以上,對於實時同步信息的模式,在大規模多人對戰手游中,並不是一種非常合適的方案。
### 解決預想(幀同步)
問題在於客戶端的網絡帶寬,如果減少客戶端接收的網絡帶寬才是重點。不去同步那么多的信息,那么就需要客戶端和服務端盡量約定規則。使用客戶端先行,服務端演練計算的方式來實現。貌似業界已經有這種方案了,傳聞lol、dota2就是這么實現的(這方便並沒進行查閱,只是有個印象)。
到戰斗開始的時候,先同步必要的信息,譬如場景內的怪物、位置、AI、血量、技能等信息和一個隨機數。AI的行為通過隨機觸發。那么需要同步的信息就只剩下那些無法確定的因素。譬如玩家,什么時候釋放什么技能、如何移動,我們是無法確定的,但只要在外面服務端的演練中同步上,那么同樣可以演練出客戶端的整個戰斗過程出來。
對比可以發現,使用這種方法,我們只需要同步玩家的技能、移動就可以了。省去了很多其它可以直接演練出來的信息。為了避免演練的偏差,可以定期同步一些內容。這樣既可以保證戰斗的一致性,也大幅度減少了帶寬流量。
當然使用這種方式,對客戶端和服務端的約定要求非常高,相比也復雜了許多,對於研發人員的要求同樣要高許多。
不過業界已經有成型的方案,自然可以解決。對比玩家體驗,這方面的優化還是很有必要的。