多人游戏是不是应该总是根据每个客户端请求从数据库中请求数据?
Posted
技术标签:
【中文标题】多人游戏是不是应该总是根据每个客户端请求从数据库中请求数据?【英文标题】:Should a multiplayer game always request data from a database on each client request?多人游戏是否应该总是根据每个客户端请求从数据库中请求数据? 【发布时间】:2012-12-29 16:35:43 【问题描述】:嗯,我不知道这个问题的标题是否合适,但我不知道如何用几句话来表达。
我目前正在开发一个多人 2D 游戏,在服务器端使用 NodeJS 和 Socket.io,在客户端使用 html5。这个游戏不需要保存玩家的进度,除非他们完成它。而且我必须确保所有关于球员的信息,例如得分和帮助,都是有效的。所以我决定将这些信息集中在服务器上,这样客户端就不会向服务器发送分数,而是根据发送的信息计算分数并将它们发送给所有客户端。除此之外,我可以在最少 2 名玩家和最多 4 名玩家的情况下运行这个游戏的不同会话。
起初,我决定通过服务器始终在内存中维护游戏会话数据来实现这一点,但现在我质疑自己是否不应该使用数据库来存储这些数据。我只在会话数据完成时才使用数据库来存储会话数据,因为我对未完成的会话数据没有用处。但是我应该在他们玩的时候维护数据库中的会话和玩家数据吗?我的问题是客户端与服务器的通信非常频繁,使用这种方法,我必须首先从数据库请求他们的数据,进行必要的更改,将其存储回数据库,然后对每个客户端请求重复此过程。也许这个问题的答案很明显,但我应该改用这种方法吗?
这是我第一次开发游戏,所以我不知道事情通常是如何运作的。我只知道我希望服务器速度快。我选择将所有内容都保存在内存中,主要是因为我发现的所有关于多人游戏开发的示例和教程都没有提到数据库......
谢谢!
【问题讨论】:
【参考方案1】:我还在使用 node.js 和 socket.io 开发多人游戏。您不应该在每个客户端请求时访问数据库,因为,
1) I/O 操作代价高昂。
读/写数据库是“昂贵的”(慢)。从内存中读取和写入要快得多。
2) I/O 操作在 Node.js 中应该是异步的。
function read_or_alter_database(input, function(callback) update_the_client(); );
这使得数据库操作非阻塞:应用程序的其余部分仍将运行,直到操作完成。然后,执行回调函数。如果玩家的客户端依赖数据库访问来更新游戏状态,那么这就变成了阻塞操作(因为数据库操作完成后游戏才能继续),这否定了Node.js的主要目的。
3) 多人游戏中会有大量的客户端请求。
这个加点 1 会导致很大的效率损失。
【讨论】:
也就是说,缓存每一位并尝试本地化缓存 这正是我的想法,但我想确定一下,非常感谢!【参考方案2】:听起来您已经有了答案:由于状态仅在会话完成后才重要,因此请仅在该会话完成时存储数据。存储中间值没有任何用处,只会减慢速度。
【讨论】:
【参考方案3】:Node.js 是一个相对较新的开发平台——不确定它是否能够支持这样的系统。就正常情况而言 - 尽可能多的信息首先存储在客户端,然后服务器通常将数据保存在内存中,或者,至少,我知道热门游戏英雄联盟、魔兽世界和星际争霸II。再说一遍,这些应用程序不是 HTML/Node.js,对系统要求非常高,并且是由大型开发公司开发的 - 可能 DB 方法适用于小型游戏,我只是从未听说过.
【讨论】:
以上是关于多人游戏是不是应该总是根据每个客户端请求从数据库中请求数据?的主要内容,如果未能解决你的问题,请参考以下文章