
切出前臺超過 30 分鐘或登錄憑證過期就走重新登錄流程必要時回到主城甚至檢查熱更新。本文說明這樣做的原因玩家離開期間服務(wù)器、數(shù)據(jù)和版本都可能已經(jīng)變了客戶端手里的狀態(tài)不再可信。一、核心原因客戶端的狀態(tài)過期了游戲切到后臺時Unity 主循環(huán)停止客戶端內(nèi)存里的數(shù)據(jù)也停在了那一刻。但服務(wù)器沒有停切到后臺時 30 分鐘后 客戶端我在副本里體力 80 服務(wù)器會話已清理副本已回收 公會戰(zhàn)進(jìn)行中版本 1.2.3 跨過了每日重置公會戰(zhàn)結(jié)束 剛發(fā)布了 1.2.4 熱更新客戶端如果按原來的狀態(tài)繼續(xù)運行就是在一個與服務(wù)器不一致的世界里操作。離開越久不一致的地方越多。重新登錄 → 回主城 → 檢查熱更新就是把客戶端重置到一個已知的正確狀態(tài)三步分別解決不同層面的問題步驟解決的問題重新登錄身份和會話失效數(shù)據(jù)需要全量同步回到主城當(dāng)前所在的場景或玩法在服務(wù)器上已經(jīng)不存在檢查熱更新客戶端版本與服務(wù)器版本不匹配二、為什么要重新登錄1. 會話在服務(wù)器上已經(jīng)被清理玩家斷線后服務(wù)器不會永久保留他的在線狀態(tài)。常見做法是斷線后保留一個重連窗口例如 3 ~ 10 分鐘。窗口內(nèi)重連服務(wù)器直接恢復(fù)會話玩家無感知超過窗口服務(wù)器把玩家判定為下線數(shù)據(jù)寫回數(shù)據(jù)庫從內(nèi)存中卸載釋放所在的場景、房間、隊伍等資源。此時客戶端再發(fā)請求服務(wù)器已經(jīng)找不到對應(yīng)的會話只能拒絕。要繼續(xù)游戲必須重新走一遍登錄認(rèn)證身份、從數(shù)據(jù)庫加載角色、分配網(wǎng)關(guān)和場景服務(wù)器。這些資源要回收是因為一個服務(wù)器可能同時承載數(shù)萬玩家。如果每個斷線的玩家都長期占用內(nèi)存和連接服務(wù)器很快就會被拖垮。2. 登錄憑證本身會過期登錄通常涉及多層憑證渠道 SDK 的 token微信、QQ、Google、各安卓渠道簽發(fā)游戲賬號服的 token登錄驗證后簽發(fā)用于進(jìn)入游戲服重連 token用于斷線后快速恢復(fù)會話。出于安全考慮這些憑證都有有效期從幾分鐘到幾小時不等。憑證過期后即使網(wǎng)絡(luò)恢復(fù)服務(wù)器也會拒絕請求此時只能重新認(rèn)證。另外玩家在后臺期間還可能發(fā)生在另一臺設(shè)備上登錄了同一賬號當(dāng)前設(shè)備已被頂下線賬號被封禁、被要求實名認(rèn)證、觸發(fā)防沉迷限制服務(wù)器進(jìn)行了停服維護(hù)所有會話都已失效。這些情況都只能通過重新登錄來發(fā)現(xiàn)和處理。3. 重新登錄是最可靠的全量同步即使會話還在離開 30 分鐘后需要更新的數(shù)據(jù)也會很多體力、離線收益、建筑和科研進(jìn)度郵件、好友、聊天、公會狀態(tài)活動的開始和結(jié)束、排行榜、商店刷新每日重置如果期間跨過了凌晨 5 點之類的刷新時間任務(wù)、次數(shù)、簽到全部重置。理論上可以為每種數(shù)據(jù)設(shè)計增量同步但實際很難做全模塊多、相互依賴、邊界情況復(fù)雜漏掉一個就會出現(xiàn)界面顯示的和實際不一樣。登錄流程本身就要拉取玩家的完整數(shù)據(jù)它是項目中測試最充分、最可靠的同步路徑。所以離開較久時與其逐個補(bǔ)丁式地刷新不如直接走一遍登錄。方式優(yōu)點缺點增量同步快、玩家無感知實現(xiàn)復(fù)雜容易遺漏離開越久越不可靠重新登錄全量簡單可靠狀態(tài)一定正確耗時有一定打斷感短時間離開用增量長時間離開用全量這就是分級處理的意義。三、為什么要回到主城1. 當(dāng)前場景可能已經(jīng)不存在玩家切出去時可能正處在副本、團(tuán)隊副本、競技場限時活動場景例如公會戰(zhàn)、世界 Boss組隊狀態(tài)或匹配隊列中某個多步驟的交互流程中比如抽卡動畫、商店購買、劇情對話。30 分鐘后服務(wù)器上的副本實例早已回收活動已經(jīng)結(jié)束隊伍已經(jīng)解散戰(zhàn)斗已經(jīng)結(jié)算??蛻舳巳绻€停留在這個場景里玩家的任何操作都會失敗或者出現(xiàn)莫名其妙的表現(xiàn)。2. 主城是一個已知的安全狀態(tài)主城的特點是不依賴臨時性的服務(wù)器資源任何時候都能進(jìn)入進(jìn)入時會按最新數(shù)據(jù)初始化界面所有玩法都從這里出發(fā)狀態(tài)最簡單。所以把玩家放回主城相當(dāng)于把客戶端復(fù)位到一個確定的起點。客戶端的 UI 棧中可能還堆著各種舊面板回主城時也一并清空。3. 必要時的含義不是每次都要回主城。重新登錄后應(yīng)該根據(jù)服務(wù)器返回的狀態(tài)決定服務(wù)器返回處理玩家仍在進(jìn)行中的對局?jǐn)嗑€重連直接回到對局玩家所在場景仍然有效例如野外地圖留在原場景刷新數(shù)據(jù)場景已失效、活動已結(jié)束回到主城并提示原因如活動已結(jié)束原則是能恢復(fù)就恢復(fù)不能恢復(fù)就回到安全狀態(tài)而不是讓玩家卡在一個無效的界面里。四、為什么要檢查熱更新1. 離開期間可能發(fā)布了新版本游戲的熱更新通常在以下時機(jī)發(fā)布例行維護(hù)時例如每周固定時間停服更新緊急修復(fù)線上 bug新活動上線前更新配置表和資源。玩家后臺掛著游戲很容易跨過這些時間點。尤其是長時間離開往往就是因為期間服務(wù)器停服維護(hù)過。2. 版本不一致的后果熱更新的內(nèi)容可能包括協(xié)議服務(wù)器新增或修改了消息結(jié)構(gòu)舊客戶端解析出錯配置表道具、活動、商店配置變了客戶端按舊表顯示價格、獎勵、條件和實際不一致腳本邏輯Lua、ILRuntime、HybridCLR 等熱更代碼修復(fù)了 bug舊客戶端仍在用有問題的邏輯資源新活動的界面和美術(shù)資源舊客戶端里根本沒有。輕則顯示錯誤重則邏輯沖突、斷線、崩潰甚至產(chǎn)生數(shù)據(jù)異常。所以很多項目的服務(wù)器在登錄時會校驗客戶端版本版本過低直接拒絕登錄要求更新。3. 為什么和重新登錄放在一起熱更新的標(biāo)準(zhǔn)流程本來就在登錄之前啟動 → 檢查版本 → 下載更新 → 重新加載資源和腳本 → 登錄 → 進(jìn)入游戲長時間離開后既然要重新登錄順便檢查一次版本成本很低。如果發(fā)現(xiàn)有新版本可選更新提示玩家允許稍后更新強(qiáng)制更新例如協(xié)議不兼容或嚴(yán)重 bug 修復(fù)必須更新后才能繼續(xù)。由于熱更新會替換腳本和資源通常需要重啟游戲流程從啟動場景重新開始這也是它排在三步中最重的一步的原因。五、30 分鐘這個閾值從哪來1. 它是經(jīng)驗值應(yīng)該跟服務(wù)器參數(shù)對齊30 分鐘只是一個示例。實際閾值應(yīng)參考服務(wù)器參數(shù)對客戶端的影響斷線重連窗口窗口內(nèi)只需重連無需重新登錄玩家會話保留時長超過后服務(wù)器已卸載玩家數(shù)據(jù)token 有效期超過后必須重新認(rèn)證每日重置時間跨過時數(shù)據(jù)大面積變化客戶端閾值應(yīng)該略小于服務(wù)器的會話保留時長并且通過配置下發(fā)而不是寫死在代碼里。2. 更好的做法讓服務(wù)器做決定客戶端用后臺時長判斷本質(zhì)上是在猜服務(wù)器的狀態(tài)。更可靠的設(shè)計是回到前臺時客戶端先嘗試用重連 token 恢復(fù)會話由服務(wù)器告訴客戶端該怎么做// 回到前臺時varresultawaitNet.TryResume(reconnectToken,clientVersion);switch(result){caseResume.Ok:SyncIncremental();break;// 會話還在增量同步caseResume.NeedRelogin:Relogin();break;// 會話或 token 失效caseResume.NeedUpdate:RestartToPatch();break;// 版本過低caseResume.Kicked:ShowKickedTip();break;// 被頂號、封禁等}客戶端的時長判斷只作為優(yōu)化例如離開超過一定時間直接跳過嘗試重連減少一次無效請求。最終結(jié)果以服務(wù)器為準(zhǔn)。3. 不同類型游戲的閾值差異游戲類型傾向?qū)崟r PVP / MOBA重連窗口短幾分鐘就可能結(jié)束對局MMO / SLG會話保留時間中等數(shù)據(jù)變化頻繁卡牌 / 放置可以更寬松以 token 有效期和每日重置為主單機(jī)基本不需要重新登錄但可能仍需檢查版本六、做好體驗避免一切出去就重啟重新登錄雖然可靠但處理不好會讓玩家覺得煩。幾個思路靜默重登憑證有效時例如 SDK 的刷新 token 還能用后臺自動完成認(rèn)證只顯示一個短暫的連接中不彈出登錄界面保留可以保留的東西玩家正在輸入的聊天內(nèi)容、正在查看的界面重登后盡量恢復(fù)說明原因回到主城或要求更新時明確提示活動已結(jié)束“服務(wù)器已更新”而不是無緣無故跳轉(zhuǎn)避開敏感流程支付、廣告回調(diào)期間不要因為后臺時長就強(qiáng)制重登先等補(bǔ)單和獎勵流程完成跨天要特殊處理即使離開時間很短如果跨過了每日重置時間也應(yīng)該刷新相關(guān)數(shù)據(jù)。七、總結(jié)玩家離開期間服務(wù)器、數(shù)據(jù)、版本都在繼續(xù)變化客戶端內(nèi)存中的狀態(tài)會逐漸過期重新登錄因為服務(wù)器已經(jīng)清理了會話、憑證已經(jīng)過期同時登錄也是最可靠的全量數(shù)據(jù)同步方式回到主城因為原來的副本、活動、隊伍可能已經(jīng)不存在主城是一個任何時候都有效的安全起點檢查熱更新因為長時間離開很可能跨過了版本發(fā)布版本不一致會導(dǎo)致協(xié)議、配置、邏輯沖突30 分鐘是經(jīng)驗值應(yīng)與服務(wù)器的重連窗口、會話保留時長、token 有效期對齊最好由服務(wù)器在重連時直接告訴客戶端該怎么處理本質(zhì)思路是狀態(tài)能確認(rèn)就恢復(fù)不能確認(rèn)就重置到已知的正確狀態(tài)同時盡量讓這個過程對玩家無感。