Real Time Strategy游戏如何在PHP中运行?

con*_*com 14 php database mmo

一些MMO实时策略游戏,如Travian或oGame,都是用PHP编写的.

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

此外,在运行RTS游戏(例如拥有1000个活跃玩家的Travian)时,人们可以期待什么样的服务器负载/带宽?

njs*_*njs 12

虽然这个话题相当陈旧,但我确实认为我仍然有一个"更好"(如果我可以这样说)我的问题回答你的问题然后模糊的"更新是由cronjobs完成的"答案.

Travian ie通过使用javascript实现了它的实时幻觉.后面实际发生的是以下内容:

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

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


Thi*_*ter 11

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

webinterface完成所有只读的东西和无害的事情,竞争条件根本不是问题 - 密码更改,重命名等等.

更重要的事情,例如构建单元或与其他玩家作战,将被提交给事件处理程序,在那里它们将被检查,验证然后存储,直到达到执行时间.在这个地方而不是在网络界面上进行检查的优点是,你可以完全消除竞争条件的风险(例如发射包含地球上所有单位的船只,同时建造昂贵的东西,这基本上会导致重复可用的单位只要你确保在给定时间只运行一个动作/事件(例如没有多线程,多处理等).

如果你的实时不完全但是使用"滴答"(例如每x分钟只发生一次动作),你当然可以使用cronjob而不是背景守护进程 - 但是你需要使用其他方法来避免竞争条件.


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

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

  • 如果你对所有东西使用相同的技术通常很容易,所以在我的例子中它是用PHP编写的.这样做的好处是我可以包含相同的函数库,而不必用两种语言编写相同的东西. (2认同)