javascript - Node js 对接会 Socket io 的两个概念我说的对吗?
问题描述
我想在我的游戏中添加匹配,但我真的不知道如何实现它。我有一些基于互联网示例的概念,但我想问一下我的猜想是否正确。
游戏说明游戏非常简单,有3个角色供玩家支持,守护者和DPS每个玩家在游戏前选择角色(多选),区域,语言所以首先匹配必须匹配团队中的玩家。
(1)所以我的第一个想法是创建一个大厅并将其保存在数据库中,如果用户正在寻找匹配项,他会向数据库发出请求,如果有大厅供他使用,他将联合到大厅,如果没有,则发出套接字大厅系统正在创建大厅,用户正在等待另一个人。
该解决方案带来了很多麻烦,例如:(如何检查是否有空位用于支持或监护人,如果有人退出该怎么办等等)
(2) 第二种思路是创建一个队列,将人员保存在一个变量中,或者使用redis,制作一个函数来匹配团队中的人员。这是我的问题节点 js 是否能够让假设 10k 玩家处于可变状态并进行操作并且仍然处理游戏的网络服务器,或者我应该选择第一个解决方案。
也许你有另一个想法如何解决这个问题
提前致谢
解决方案
我知道这个胎面已经变老了。不过,也许我的想法可能会对某人有所帮助。
在您的情况下,我会做的是根本不将数据库用于配对系统。对数据库的调用在时间、资源和金钱方面都是昂贵的。另一方面,仅在服务器端持有它会更快、更可扩展且更便宜。更重要的是,你真的不需要为这个功能使用数据库(我认为这不是它的目的,因为如果服务器关闭,那么每个玩家都会断开连接并且不要指望仍然在寻找匹配) .
只需使用存储在游戏管理器中的对象,如下所示:
this.match = {
123: {
support: idPlayer1,
dps: idPlayer2,
guardian: undefined,
region: 'EU',
language: 'fr'
}
}
123 是匹配的 id,idPlayerX 是玩家的 id。一旦有人在寻找匹配,您只需要遍历对象并提取可能适合玩家的每个匹配,然后过滤最适合的匹配并将用户注册到该匹配(只是他的 id应该够远了)。然后,您还可以将比赛的 id 保存在播放器对象(服务器端)中。
我对免费角色使用“未定义”值,因为很容易测试角色是否免费。
如果有人离开队列,只需检索带有 id 的匹配项,将角色设置为未定义并释放播放器对象中的匹配变量。
如果匹配最终已满(或所有人都离开了),只需删除条目:
delete this.match[id]
这样,您应该保留一个非常轻量级的变量,并将该死的大量调用保存到您的数据库中。这是一个非常基本的匹配系统,但如果需要很容易复杂化。
推荐阅读
- javascript - Javascript Click 按钮在 Chrome 中有效,但在 IE 中无效
- r - Tidyeval 在自己的函数中在自己的函数中使用管道
- sql-server - BCP 转换规范的字符无效
- machine-learning - 我如何训练一个模型,其中我有两组不同的数据要同时训练?
- python - 特定小部件的paintEvent()
- firebase - 可以在 Stackdriver 中显示 Firebase 调用的函数
- python-3.x - 添加 int 和 Class 对象
- java - Mule4在dataweave中的映射后批量插入提示字段包含多个对象的错误
- java - 如何使用命令在帮助中添加备忘单菜单项
- css - 如何在 C# 中优化 CSS 文件