某页游erlang服务端广播算法效率好差,应该算是一个bug了吧

偶然得到一份erlang网页服务端的代码
写的非常优雅,文档也非常不错,但我看到他的场景管理中的广播算法,写的很漂亮,但效率非常低。
每次都全局遍历全部在线玩家查找在某个场景的玩家,这样的算法,我不知道一个服能撑起多少人,优化一下,场景服务管理在他服务中的玩家,NPC,MON,效率会提升好几倍,只是代码会稍微复杂一点,没他写的优雅了!!

  AllUser = ets:match(?ETS_ONLINE, #ets_online{id = '$1',x = '$2', y='$3', scene = Q, _='_'}), %%这句代码效率会很差的,而且执行的次数又多




%%  获取要广播的范围用户ID
get_broadcast_id(Q, X0, Y0) ->
    AllUser = ets:match(?ETS_ONLINE, #ets_online{id = '$1',x = '$2', y='$3', scene = Q, _='_'}), %% 这句代码效率会很差的,而且执行的次数又多
    XY2 = lib_scene:get_xy(X0, Y0),
    get_broadcast_id_loop(AllUser, XY2, []).

get_broadcast_id_loop([], _XY2, D) ->
    D;
get_broadcast_id_loop([[Id, X, Y]|T], XY2, D) ->
    XY = lib_scene:get_xy(X, Y),
    if
        XY == XY2 orelse XY == XY2 + 1 orelse XY == XY2 -1 orelse XY == XY2 -8 orelse XY == XY2 +8 orelse XY == XY2 -9 orelse XY == XY2 +9 orelse XY == XY2 -7  orelse XY == XY2+7 ->
            get_broadcast_id_loop(T, XY2, D++[Id]);
        true->
            get_broadcast_id_loop(T, XY2, D)
    end.


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值