之前我們向運營要求更多的導入,運營說每每開服導入流量,我們的留存並不高,拒絕更多流量導入。
剛剛完成的壓力測試,我發現大量用戶在集中時間內湧入服務器,創角進入遊戲佔用了90%的cpu時間,服務器基本沒有cpu資源響應其他。
這是個很嚴重的問題,第一次的體驗決定了這個玩家的感受,決定了遊戲的留存。
閱讀代碼,創角和進入遊戲的代碼含有不少的同步數據庫操作。怎麼破?
我的想法是,開服前提前創建5000個角色和相應的玩法數據。創建時,系統分配一個角色數據,進入遊戲,服務器僅僅需要一步數據庫操作,更新此角色數據和帳號的關係。
開服,進入遊戲效率低下解決
1思路
不要讓多個用戶進入遊戲循環這個同步操作,產生競爭條件,延伸就是不使用一個線程一個世界,一個服務區多個線程分多個世界線的概念,使用一個線程幾個場景,一個服務區一個世界。還是那麼多用戶,那是那麼多線程,進入不同場景的用戶進入不同的線程,爭奪互斥資源的機率大大減小。
不在遊戲循環內加載用戶數據,或者保存用戶數據
對於進入遊戲不使用進入場景算法。單獨設計,並增強爲進入計算展開,一次計算多個用戶進入(掃描在場用戶針對多個進場用戶)
2方案
0 賬號的狀態設置爲 logining , login , logouting , logout 。
1 用戶數據庫讀寫分離,假設單獨的用戶數據加載服務器SERVERusrdata。登錄授權完成後,在此加載用戶數據。
2 SERVERusrdata上用戶數據加載完成後,向客戶端發送信號SINGALusrdata。
3 客戶端接收信號SINGALusrdata,登錄遊戲服務器SERVERgame。
檢查賬號的狀態,
logining ,logouting ,返回SINGALretry 3次後間隔更長時間
login ,不用拉取數據,切換賬號會話,舊鏈接丟棄即可。
none , logout ,向SERVERusrdata拉取用戶數據,設置爲 logining
4 SERVERgame向SERVERusrdata拉取用戶數據(保存在遊戲同步循環外LOOP的內存區),
成功向客戶端發送SINGALgameok,並安排LOOP內的任務,
失敗向客戶端發送SINGALgamefailse,
5 客戶端收到SINGALgameok,do something;收到SINGALgamefailse,重複3,4,5
6 不同的LOOP執行step4安排的任務
計算位置和屬性和戰鬥的同步
同一場景可以一次計算多個進入
設置狀態爲 login
7 loop
8 設置賬號的狀態爲 logouting ,安排LOOP外的任務
9 保存用戶數據結束,設置賬號的狀態爲 logout