关于一对一匹配的"天梯系统"的规则, 大家来帮我优化一下吧...

糖几颗的 2014-12-30 09:15:37
天梯匹配系统, 只用一个积分来做匹配, 一对一匹配.
积分的规则就是策划定的公式, 这个跳过.
我的当前结构是这样的:
相同积分的玩家存到一个 list 里面. 然后将这个list用积分做key, 存在一个map里面.
当一个积分是 1000 的玩家查找对手的时候. 我会去map 里面把 800 到 1200 范围(这个范围是策划定)内的所有list取出来( 也就是这里我循环了400次!!) 然后从每个list 里面随机抽取几个玩家, 汇总到一个总的list里面. 最后从总的list里随机一个玩家(或者几个玩家先放到当前玩家的一个域里, 这样玩家再找的时候就直接从身上取, 而不再这么找一次)
这就是我目前写的天梯系统匹配... 感觉写的很烂.
大家能分享一下自己写的规则么... 求教
...全文
319 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kosora曹 2015-01-05
  • 打赏
  • 举报
回复
天梯匹配肯定是有一些数学公式在里边的,通过纯程序设计、纯数据结构的角度设计往往程序比较复杂,而且效果还没有数学公式好。
乔巴好萌 2014-12-30
  • 打赏
  • 举报
回复
没必要过早优化的 先做出系统 然后profile看看够不够performance 然后再看看怎么针对具体的问题调优 见过一些项目 都是过早介入调优后 然后失败了 因为一些看起来复杂度很低的算法 往往又挂着一个很大的常熟 所以。。。尽量有针对性的调优
糖几颗的 2014-12-30
  • 打赏
  • 举报
回复
也确实.. 如果能接受的话.. 是没什么问题的... 我还是按照这个来优化一下.然后好好测试一下吧.. 虽然游戏服务器写了不少.. 但是这个系统还是第一次写... 心里没谱...
引用 4 楼 openXMPP 的回复:
我觉得你可以测测这部分的performance 就循环100万次 map根据你们线上的情况 将800-1200之间设定一个比较大的值 然后跑100万或1000万次看看performance 如果很慢 再改 不慢的话(比如一个匹配操作也就不到100微妙,这样的话你并发能支持1W个同时匹配) 如果能满足需求 就不改了呗 一切不成熟的优化 都是万恶之源 [quote=引用 3 楼 luxiaoleics 的回复:] [quote=引用 2 楼 openXMPP 的回复:] 如果你每个list特别大 那可以考虑基于多线程去fetch 但感觉数据不是很大啊 java做这个应该不是瓶颈啊 现在你这个APP上线了? 这部分返回结果不是很快?
目前还没上线.... 因为是在线数据打离线数据.. 所以数据量会越来越大的... 我只是觉得从 800到1200这种区间内去取值的时候, 要循环400次.. 而且其中还有可能是空值(即这个积分没有玩家)... 我现在优化了一下下.. 就是先从800到1200 这个段内随机取出 几个 积分.. 然后再根据这几个积分..去map中取list.. 然后再像你说的那样边取list边从里面随机几个数据汇总... 但感觉我这个结构... 优化的空间好像还挺大的...... 担心上线的时候性能出问题.... [/quote][/quote]
乔巴好萌 2014-12-30
  • 打赏
  • 举报
回复
我觉得你可以测测这部分的performance 就循环100万次 map根据你们线上的情况 将800-1200之间设定一个比较大的值 然后跑100万或1000万次看看performance 如果很慢 再改 不慢的话(比如一个匹配操作也就不到100微妙,这样的话你并发能支持1W个同时匹配) 如果能满足需求 就不改了呗 一切不成熟的优化 都是万恶之源
引用 3 楼 luxiaoleics 的回复:
[quote=引用 2 楼 openXMPP 的回复:] 如果你每个list特别大 那可以考虑基于多线程去fetch 但感觉数据不是很大啊 java做这个应该不是瓶颈啊 现在你这个APP上线了? 这部分返回结果不是很快?
目前还没上线.... 因为是在线数据打离线数据.. 所以数据量会越来越大的... 我只是觉得从 800到1200这种区间内去取值的时候, 要循环400次.. 而且其中还有可能是空值(即这个积分没有玩家)... 我现在优化了一下下.. 就是先从800到1200 这个段内随机取出 几个 积分.. 然后再根据这几个积分..去map中取list.. 然后再像你说的那样边取list边从里面随机几个数据汇总... 但感觉我这个结构... 优化的空间好像还挺大的...... 担心上线的时候性能出问题.... [/quote]
糖几颗的 2014-12-30
  • 打赏
  • 举报
回复
引用 2 楼 openXMPP 的回复:
如果你每个list特别大 那可以考虑基于多线程去fetch 但感觉数据不是很大啊 java做这个应该不是瓶颈啊 现在你这个APP上线了? 这部分返回结果不是很快?
目前还没上线.... 因为是在线数据打离线数据.. 所以数据量会越来越大的... 我只是觉得从 800到1200这种区间内去取值的时候, 要循环400次.. 而且其中还有可能是空值(即这个积分没有玩家)... 我现在优化了一下下.. 就是先从800到1200 这个段内随机取出 几个 积分.. 然后再根据这几个积分..去map中取list.. 然后再像你说的那样边取list边从里面随机几个数据汇总... 但感觉我这个结构... 优化的空间好像还挺大的...... 担心上线的时候性能出问题....
乔巴好萌 2014-12-30
  • 打赏
  • 举报
回复
如果你每个list特别大 那可以考虑基于多线程去fetch 但感觉数据不是很大啊 java做这个应该不是瓶颈啊 现在你这个APP上线了? 这部分返回结果不是很快?
乔巴好萌 2014-12-30
  • 打赏
  • 举报
回复
感觉量不是很大啊 但是感觉你相同的积分应该比较密集 或者说你用Map的话 积分做Key 可能导致map里某些value的list贴别长 猜测系统整体符合正态分布 所以你中间端的value应该会比较大 所以你可以考虑再采用其他的key 而不单纯是一个积分 另外你从800-1200取值只是为了random数组 拼凑出来一个域 这个没必要取完list再做random 可以遍取编做random 最后取完了直接形成一个域返回

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧