我不知道这个问题的标题是否合适,但我不知道如何用几句话来表达。
我目前正在使用服务器端的NodeJS和Socket.io以及客户端的HTML5开发多人2D游戏。除非他们完成游戏,否则此游戏不需要保存玩家进度。我必须确保所有关于球员的信息,例如得分和帮助始终有效。所以我决定将这些信息集中在服务器上,这样客户端就不会向服务器发送分数,而是根据发送的信息计算服务器计算分数并将其发送给所有客户端。除此之外,我可以让这个游戏的不同会话最少运行2名玩家,最多4名玩家。
起初我决定在服务器上始终维护内存中的游戏会话数据来实现这一点,但现在我在质疑自己是否应该使用数据库来存储这些数据。我正在使用数据库来存储会话数据,因为我没有使用未完成的会话数据。但是,我应该在他们玩的时候维护数据库中的会话和玩家数据吗?我的问题是客户端经常与服务器通信,这种方法我必须首先从数据库请求他们的数据,进行必要的更改,将其存储回数据库,并在每个客户端请求上重复此过程。也许答案很明显,但我应该使用这种方法吗?
这是我第一次开发游戏,所以我不知道游戏通常如何运作。我只知道我希望服务器快速。我选择维护内存中的所有内容主要是因为我发现有关多人游戏开发的所有示例和教程都没有提到数据库...
谢谢!
答案 0 :(得分:5)
我也在使用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会导致效率大幅下降。
答案 1 :(得分:0)
听起来你已经有了答案:由于状态仅在会话完成后才重要,因此只有在完成该会话后才存储数据。存储中间值没有任何意义,只会减慢速度。
答案 2 :(得分:-1)
Node.js是一个相对较新的开发平台 - 不确定它是否能够支持这样的系统。至于NORMALLY做了什么 - 尽可能多的信息存储在客户端,首先关闭,然后服务器通常将数据保存在内存中,或者,至少,我知道这是热门游戏英雄联盟,魔兽世界和星际争霸II。然后,那些应用程序不是HTML / Node.js,对系统要求非常高,并且是由大型开发公司提供的 - 可能是DB方法适用于较小的游戏,我从来没有听说过它