天天看點

遊戲服務端開發-排行榜開頭結構排序時間間隔實作性能提升

開頭

排行榜幾乎是每個網絡遊戲都有的系統,以下用Erlang以例,分享一種排行榜實作方式。

結構

每個排行榜對應一個actor,State使用如下結構:

%% 通用排行榜結構
-record(rank_list, {
    key         = undefined, %% 排行榜的唯一key
    sort_list   = [], %% [one_rank{}] 已經排好序的清單
    ready_list  = [], %% [one_rank{}] 待排序的清單
    sort_time   = 0 %% 排行榜的重新整理間隔
}).

-record(one_rank, {
    user        =   0, %% 玩家id
    num         =   0, %% 用于排行榜排序的字段
    rank        =   0  %% 排名
}).
           

排序時間間隔

排序是一種消耗性能的操作,是以服務端要盡量避免實時重新整理的排行榜。最好是定下每種排行榜的重新整理間隔,再用定時器實作定時排序。

實作

  1. 有資料插入排行榜時,插入or更新ready_list裡的資料
  2. 執行排序時,對ready_list裡的資料進行排序,同時指派給sort_list

性能提升

  1. 限制排行榜的長度,也是就限制sort_list的長度,提高查找sort_list的性能
  2. 增加1個标志位,記錄在重新整理間隔時間内,ready_list是否發生過改變,若沒有改變,即使到達排序時間也不進行排序
  3. 每次執行排序後,同時産生兩個map, 一個以user(玩家id)為key,#one_rank{}為value;另一個以rank(排名)為key,#one_rank{}為value; 以空間換時間,提高查找速度
遊戲服務端開發系列

遊戲服務端開發-好友系統

遊戲服務端開發-排行榜

遊戲服務端開發-郵件系統

遊戲服務端開發-全局唯一ID

遊戲服務端開發-AOI-九宮格法解析

繼續閱讀