最近陸陸續續在給游戲做斷線重連相關的工作,大廳服的斷線重連問題不是很大,難點主要在于戰斗中的斷線重連。斷線重連要解決的核心問題是客戶端在一段時間內丟失了和服務器的響應后,如何重新建立客戶端的數據和狀態的正確性。導致重連的原因也分為兩類:1.網絡不好 2.切后臺游戲進程被掛起(偽重連)。而兩種原因產生需要重連處理的情況又分為兩種:1.有收發的消息包丟失,重連后不會受到丟失的消息包 2.網絡連接并沒有真正斷開,重連后會重新收到所有丟失的消息包。
對于第一種情況,產生了消息包丟失,需要重新同步有可能異常的客戶端狀態。對于大廳服,我選擇了重新請求所有用戶數據。對于戰斗服,選擇重建所有戰斗狀態。
對于第二種情況,在重新連接(或者從后臺切回來)后,所有的消息包都會重新收到。這個時候會產生的一個問題是消息包可能已經失去了時效性。比如本來需要在載入戰斗場景之前收到的消息包在載入之后才收到,導致在載入戰斗場景之后沒有數據創建戰斗界面。對于此類情況,一個比較簡單的解決方案,是對處理消息包的加入節點等待控制。比如在載入戰斗場景之后才向服務器請求創建界面所需消息包,或者某些消息包必須等到客戶端的某些節點完成后才處理。當然同時要保證消息包處理的有序性,如果一個消息包等待節點時,在它之后的消息包的處理都會暫停。另外一個產生問題的地方在于消息包之間失去了處理間隔。如本來一個怪物的銷毀消息一般在創建消息至少幾幀之后收到,如果在同幀收到創建和銷毀一個怪物的消息,可能會導致處理這個怪物創建的異步操作還沒有真正完成,這個怪物銷毀的消息就處理掉了,導致這個創建出來的怪物再也不會被銷毀。
不管怎么說,長時間未登錄會產生一系列的問題,如發現最新的游戲版本、客戶端數據失效嚴重難以重建等。一個重連后常見的處理措施是讓玩家重新登錄游戲來重建游戲環境。