14

一些 MMO 实时战略游戏,例如 Travian 或 oGame 是用 PHP 编码的。

你能简单解释一下这样的游戏在幕后是如何运作的吗?游戏如何在没有玩家请求的情况下进行实时数据库更新?

此外,在运行具有 1000 名活跃玩家的 RTS 游戏(例如 Travian)时,需要什么样的服务器负载/带宽?

4

5 回答 5

12

尽管这个话题相当古老,但我确实认为我仍然对您的问题有一个“更好”(如果我自己可以这么说的话)的答案,然后是模糊的“更新由 cronjobs 完成”的答案。

Travian ie 通过使用 javascript 给您一种实时的错觉。后面实际发生的情况如下:

玩家 A 向玩家 B 发送攻击。在 MySQL 数据库中,这是用到达的时间戳记录的。每次玩家 A 更改或刷新页面时,都会启动一个脚本(通过使用包含)来检查与该玩家有关的任何活动(援军到达、攻击到达目标等)。该脚本显然会检查当前时间并查看时间戳小于当前时间戳的所有活动。这意味着该行动应该已经发生。就在那一刻,动作实际上得到了处理。

这也意味着,如果玩家 A 和玩家 B 都没有再次登录,则永远不会计算攻击,除非其他人也攻击了玩家 B - 然后玩家 B 和攻击玩家的所有活动都将被处理。

于 2013-01-07T23:45:59.857 回答
11

通常有两个部分:Web 界面和后台守护程序(通常称为“事件处理程序”)。

网络界面执行所有只读的事情和无害的事情,而竞争条件根本不是问题——密码更改、重命名等等。

更重要的事情,例如建造单位或与其他玩家战斗,将提交给事件处理程序,在那里它们将被检查、验证并存储,直到达到执行时间。在这个地方而不是在 web 界面中执行检查的好处是您可以完全消除竞争条件的风险(例如发射包含行星上所有单位的船只,同时建造一些昂贵的东西,这基本上会导致重复可用的单位播放器),只要您确保在给定时间仅运行一个动作/事件(例如,没有多线程、多处理等)。

如果您的不是完全实时的,而是使用“滴答声”(例如,动作仅每 x 分钟发生一次),您当然可以使用 cronjob 而不是后台守护程序 - 但是您需要使用其他方式来避免竞争条件。


在我自己的游戏中,我有一个后台守护进程,它有一个类似 RPC 的接口,所以在 web 接口中我只需调用一个函数syncCall('someFunction', ....);,然后该函数将通过套接字连接到后台守护进程并执行给定的函数,返回该函数返回的任何内容。

但是,如果我现在写一个新游戏,我肯定会使用异步解决方案,例如 node.js 或其中一个异步 python 框架。它消除了拥有两个不同部分的需要 - 但对于某些部分,您必须注意锁定,因为每当您从节点本身调用的函数之一返回时,可能会执行来自另一个事件的回调。

于 2012-02-27T18:10:33.103 回答
4

更新最有可能由 cron 作业完成,或者另一种可能性是它们在登录/任何页面更改时进行。带宽可能会有很大差异,具体取决于活跃用户的数量、有多少可能性等等。我认为您应该在 localhost/test hist 上使用示例请求对其进行测量,因为它在很大程度上取决于项目。

另外,如果有相当数量的玩家等,我会考虑不使用 PHP+MySQL 进行编码,而是使用 Python&PostgreSQL,甚至可能是 Java,或其他系统。

于 2012-02-27T18:07:57.367 回答
1

正如用户 1842120 所说:Travian 实时是一种错觉。

我将简单解释一下“实时”在 Web 游戏中的工作原理......

假设有 3 个玩家,其中 2 个在线..,P1 攻击 P3,当重新加载页面或更改页面时,脚本将被激活,P3 将被攻击..

P3 离线,他看不到攻击但它正在发生。,当 P3 上线时,P3 看到他/她的村庄正在受到攻击,简单地说:

你只需要一个客户端(在线用户/页面上的浏览器)来运行游戏....

于 2014-01-08T21:27:33.670 回答
-3

我认为我会使用 iframe 和 javascript 来更新它们。因此,就像隐藏的 1 个信息 iFrame 和 qui/output iFrame,其 url 指的是 php,并且一直在更新。

于 2013-12-02T21:09:44.990 回答