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

问题描述 投票:14回答:5

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

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

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

php database mmo
5个回答
12
投票

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

Travian即通过使用javascript为您提供实时的幻觉。后面实际发生的是以下内容:

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

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


11
投票

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

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

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

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


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

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


4
投票

更新是由cron作业完成的,或者是另一种可能性,即他们在登录/任何页面更改时都会这样做。根据用户的活跃程度,有多少可能性等,带宽可能会有很大差异。我认为您应该在localhost / test hist上使用示例请求进行测量,因为它非常依赖于项目。

此外,如果会有相当数量的玩家等,我会想到不是在PHP + MySQL中编码,而是在Python和PostgreSQL,甚至Java或其他系统中编码。


1
投票

用户1842120说:Travian实时是一种错觉..

我只是简单解释一下'实时'如何在网络游戏中运作......

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

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

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


-3
投票

我认为我会煽动iframe和javascript来更新它们。所以像1信息iFrame隐藏和qui /输出iFrames谁是url引用php和谁一直在更新。

© www.soinside.com 2019 - 2024. All rights reserved.