游戏服务端开发-排行榜

开头

排行榜几乎是每个网络游戏都有的系统,以下用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; 以空间换时间,提高查找速度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章