我应该如何跟踪玩家在MMO中​​的实时位置?


14

您如何跟踪MMORPG中玩家的位置?我读到您可以使用数据库,也可以将坐标存储在文件中。我尝试使用数据库,但是速度很慢。如何使用文件来跟踪玩家位置?

Answers:


23

如何使用文件来跟踪玩家位置?

您将播放器位置写入文件。例如,如果您用唯一编号(或GUID)标识每个播放器,则可以将其用作文件名。在文件中,只需以以后可以解析的格式写出位置数据即可。例如,如果玩家#467239位于那个(x,y,z)位置,则467239.txt可能包含。20, 3, 19

这与您对数据库所做的操作没有什么不同,但是,此操作不应使数据库“变慢”,它应该非常快(可能比文件快),因为您有更多的磁盘IO开销或IO锁定竞争-如果您在每个文件中存储了多个职位-则采用基于文件系统的方法)。

也许您正在尝试使用数据库或文件系统在运行时存储玩家位置?您根本不应该这样做

在运行时,应该像其他任何类型的游戏一样,在服务器中将玩家位置保存在内存中并进行更新。可以定期将它们保存到磁盘或其他永久性存储中-例如,当播放器休息,保存或注销时。

但是写每个球员的位置来存储每次更新都是不必要的,而且效率很低。它永远不会足够快地处理任何类似于“大规模”玩家规模的事情。


1
是的,实际上,我是在运行时将玩家位置保存到postgreSQL的。但是,如果我将其保存在服务器内存中,如何更新客户端中的位置?
巴卡里2011年

12
在所有情况下,更新客户端的方法都是相同的:服务器通过网络消息告诉客户端他或她的位置是什么(或更现实的是,进行本地预测的客户端也具有以下位置:服务器验证并确认客户端)。您不应让客户端访问服务器正在访问的数据库。

1
我错过了说“用文件执行”的意思,只是为了解释它实际上比使用db更糟糕,然后解释哪个是真正的问题。为什么首先需要无用的文件说明?它只会使随便的读者感到困惑,对任何人都没有好处。
o0'。

6
我过去的经验是,忽略直接的问题,而只是继续讲授我认为“正确的方式”应该是什么,这往往会更具对抗性,并且使OP不太愿意接受被引导脱离较弱基础的问题,他们最初的问题是来自,仅此而已。

13

该位置在使用时必须位于RAM中。(例如:玩家的角色在世界上)您不能将DB用作操作内存。好吧,但是这将是可怕的。

您应该定期保存职位,但不要每次都更改。

我也将避免同时保存所有职位。如果要在服务器崩溃的情况下保持持久性,则应尽可能多地保存位置,但要保留游戏的空闲时间。只需分批完成即可。

在有空余时间的情况下保存30个职位。

至于客户。他们应该通过与服务器软件的连接来接收(相关的)游戏状态更新。不是来自数据库 ……那将是不切实际的,缓慢的,糟糕的,邪恶的,并且力量会受到干扰。


2
是的,请使用单独的线程来避免数据库可能阻塞游戏循环其余部分的情况。
郊狼


4

我在服务器上所做的就是存储玩家的方向(向量)和最后位置,如果玩家有速度,我会每2秒计算一次玩家的新位置。

客户端当然具有其自己的位置位置,并将其新的方向(矢量)发送到服务器。

如果客户自上次检查以来已移动一定距离,则服务器将对位置进行授权,并发送位置数据包(这可能导致橡皮筋效果,因为客户不同步)。

所有这些当然都在记忆中发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.