首页 > 解决方案 > Node js 对接会 Socket io 的两个概念我说的对吗?

问题描述

我想在我的游戏中添加匹配,但我真的不知道如何实现它。我有一些基于互联网示例的概念,但我想问一下我的猜想是否正确。

游戏说明游戏非常简单,有3个角色供玩家支持,守护者和DPS每个玩家在游戏前选择角色(多选),区域,语言所以首先匹配必须匹配团队中的玩家。

(1)所以我的第一个想法是创建一个大厅并将其保存在数据库中,如果用户正在寻找匹配项,他会向数据库发出请求,如果有大厅供他使用,他将联合到大厅,如果没有,则发出套接字大厅系统正在创建大厅,用户正在等待另一个人。

该解决方案带来了很多麻烦,例如:(如何检查是否有空位用于支持或监护人,如果有人退出该怎么办等等)

(2) 第二种思路是创建一个队列,将人员保存在一个变量中,或者使用redis,制作一个函数来匹配团队中的人员。这是我的问题节点 js 是否能够让假设 10k 玩家处于可变状态并进行操作并且仍然处理游戏的网络服务器,或者我应该选择第一个解决方案。

也许你有另一个想法如何解决这个问题

提前致谢

标签: javascriptnode.jsmongodbsocketssocket.io

解决方案


我知道这个胎面已经变老了。不过,也许我的想法可能会对某人有所帮助。

在您的情况下,我会做的是根本不将数据库用于配对系统。对数据库的调用在时间、资源和金钱方面都是昂贵的。另一方面,仅在服务器端持有它会更快、更可扩展且更便宜。更重要的是,你真的不需要为这个功能使用数据库(我认为这不是它的目的,因为如果服务器关闭,那么每个玩家都会断开连接并且不要指望仍然在寻找匹配) .

只需使用存储在游戏管理器中的对象,如下所示:

this.match = {
    123: {
        support: idPlayer1,
        dps: idPlayer2,
        guardian: undefined,
        region: 'EU',
        language: 'fr'
    }
}

123 是匹配的 id,idPlayerX 是玩家的 id。一旦有人在寻找匹配,您只需要遍历对象并提取可能适合玩家的每个匹配,然后过滤最适合的匹配并将用户注册到该匹配(只是他的 id应该够远了)。然后,您还可以将比赛的 id 保存在播放器对象(服务器端)中。

我对免费角色使用“未定义”值,因为很容易测试角色是否免费。

如果有人离开队列,只需检索带有 id 的匹配项,将角色设置为未定义并释放播放器对象中的匹配变量。

如果匹配最终已满(或所有人都离开了),只需删除条目:

delete this.match[id]

这样,您应该保留一个非常轻量级的变量,并将该死的大量调用保存到您的数据库中。这是一个非常基本的匹配系统,但如果需要很容易复杂化。


推荐阅读