某页游erlang服务端广播算法效率好差,应该算是一个bug了吧
2015-01-09 00:01
253 查看
偶然得到一份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.
写的非常优雅,文档也非常不错,但我看到他的场景管理中的广播算法,写的很漂亮,但效率非常低。
每次都全局遍历全部在线玩家查找在某个场景的玩家,这样的算法,我不知道一个服能撑起多少人,优化一下,场景服务管理在他服务中的玩家,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.
相关文章推荐
- 应该算是WebFormView的一个Bug
- MySQL JDBC 5.1.25的一个坑(应该算是BUG)
- 应该算是WebFormView的一个Bug
- 今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适
- 新发现判断一个点在多边形的最高效率算法 推荐******
- BUG平台应该是一个知识库
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 貌似算是一个iOS的bug,很头疼
- 算法、编码时间、执行效率,一个都不能少——写在参加Google编程挑战赛之后
- Erlang 程序引发共享内存 bug 的一个例子
- 一个简单的算法_应该是最笨的写法了
- Erlang练习:洗牌算法——将一个序列打乱,类似于Python里面的shuffle函数。
- 艾伟也谈项目管理,BUG平台应该是一个知识库
- 非等宽字体的编号对齐问题--这应该算是Office 2007的BUG吧?
- 折半查找实现算法二(递归办法)PS:编译后有一个warning,但不影响结果,代码设计上应该还有些问题
- 今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适
- 新发现判断一个点在多边形的最高效率算法 推荐******
- 一个不应该发生的BUG。。。
- 用Erlang实现一个组合算法
- Erlang 程序引发共享内存 bug 的一个例子