V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
flyzero
V2EX  ›  问与答

游戏后台一个功能没有想到好办法,所有问问大家

  •  
  •   flyzero · 2019-02-23 15:42:19 +08:00 · 2072 次点击
    这是一个创建于 2096 天前的主题,其中的信息可能已经有所发展或是发生改变。

    功能是这样的: 游戏里面有 pvp 功能,每天 22 点都会根据 pvp 积分进行结算然后发放奖励

    现在的做法是: 专门开一个服务,定点统计所有玩家 pvp 积分排名,然后奖励

    但是考虑到如果用户量特别大的话,耗时严重,结算也不太准确( 22 点的时候有玩家玩 pvp 更新了积分,但还没统计到他)

    想了半天也没有想到更加合理的办法,所以问问 v 友们

    16 条回复    2019-02-23 17:29:26 +08:00
    woscaizi
        1
    woscaizi  
       2019-02-23 16:02:37 +08:00 via iPhone
    给积分加个更新时间字段,到时直接选取时间范围内按照积分 order by desc 的结果?
    xiaotuzi
        2
    xiaotuzi  
       2019-02-23 16:03:49 +08:00 via iPhone
    (曾维护过 xxx 平台复利计息系统,他们机器每天 23 点更新分红,几乎每天都炸(˶‾᷄⁻̫‾᷅˵))
    PHP 的程序,PHP 在特别庞大复杂计算的时候会很慢,跟你的问题差不多吧。
    解决方案如下:(简单-复杂)
    (处理过的数据一定要加更新时间,防止重复操作)
    1,如果计算的数据结果可以延迟一两小时到客户账户,且不会造成其他影响,那么就发布公告:xx 数据更新时间是 22:00-23:00 之间。那么这段时间就慢慢处理数据吧,反正结果不会影响客户操作。
    2,多线程数据库分割处理。10w 数据,分为 5w+5w,两个线程处理,或者更多划分,以达到最快速度处理完(服务器要求要高)。(加服务器,分布式处理更复杂一点,需要数据再集中一次,看你如何操作了)
    3,整体系统积分设计上调整。每个用户每个操作有积分获取或者扣除的,能立刻得出结果,不必要统一批处理。(目测基本不可能这么玩)

    仅供参考。
    song0071000
        3
    song0071000  
       2019-02-23 16:09:48 +08:00
    减少要排序的数据量
    一定要给所有的玩家做排序?过滤部分 pvp 积分很小玩家
    wake156
        4
    wake156  
       2019-02-23 16:13:12 +08:00
    用户 id 和对应积分放到缓存里,然后 22:00 点开始结束计分,开始排序结算,22:15 或者 22:30 发放奖励
    这样行不?
    wake156
        5
    wake156  
       2019-02-23 16:22:04 +08:00
    用户数量级别不可能是天文数字,不太可能导致排序慢
    chinvo
        6
    chinvo  
       2019-02-23 16:23:11 +08:00
    比较同意 @xiaotuzi #2,尤其是第三条,可以在每个得分点就进行积分操作,积分分为积分日志和按天归档日志,在按天归档日志里,每条记录都是一个用户从昨天 22:00 到今天 22:00 的 pvp 积分和(每次增加积分日志的时候就给按天归档日志做一个庚新),22 点的时候跑后台进程做排序甚至直接用数据库的查询语句排序就完了
    ymj123
        7
    ymj123  
       2019-02-23 16:27:35 +08:00 via Android
    你游戏上线了吗?别到时候玩家都没几个,根本没这个烦恼。😂
    zhy0216
        8
    zhy0216  
       2019-02-23 16:31:53 +08:00 via iPhone
    如果只关心比如说前一千名的玩家 可以开个 1000 的数组 每次拿比如 5 万数据遍历 然后更新那个数组
    应该比直接排序快
    pkokp8
        9
    pkokp8  
       2019-02-23 16:34:40 +08:00 via Android
    产生积分的时候就计算规定时间的总合,分散计算的强度
    justbuy
        10
    justbuy  
       2019-02-23 16:42:55 +08:00 via iPhone
    10:30 发奖励
    flyzero
        11
    flyzero  
    OP
       2019-02-23 16:50:54 +08:00 via Android
    好像只能需要一个时间段来处理了
    misaka19000
        12
    misaka19000  
       2019-02-23 16:54:50 +08:00 via Android
    用 spark 来算
    JamesR
        13
    JamesR  
       2019-02-23 17:06:56 +08:00
    搞笑,有多少玩家啊,千万级别万家有吗?
    千万级别玩家在普通数据库里照样 2-3 秒完成计算。
    zzj0311
        14
    zzj0311  
       2019-02-23 17:12:39 +08:00 via Android
    又不需要实时发奖,慢慢算呗
    Amit
        15
    Amit  
       2019-02-23 17:13:34 +08:00
    1、从业务方面加限制,特定任务限制时间段
    2、使用流计算,就是有点太重了
    一般游戏里面排名都不是实时的,会等到第二天或下周更新排名
    changnet
        16
    changnet  
       2019-02-23 17:29:26 +08:00 via Android   ❤️ 1
    1. 这个功能为啥不是游戏服务器做而是游戏后台做
    2. 就个积分排序,几万人直接内存中排就完了
    3.人实在是太多,有几百万上亿,分段排即可,又不需要实时发奖励

    我很好奇用户量特别大是有多大,耗时严重有多严重?

    因为我见过的游戏服务器数据都是常驻内存,全服几万人排序都是毫秒级别的,排个奖励都是直接排的,没特殊处理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:29 · PVG 13:29 · LAX 21:29 · JFK 00:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.