在群组中分享实时GPS坐标的最佳方式是什么?

时间:2011-03-11 23:14:56

标签: php javascript mysql mobile gps

我正在设计一款游戏,要求玩家了解(接近)实时的其他玩家的GPS真实世界位置。可能有约5秒的延迟并且仍能正常运行。

目标平台是Android,但我有兴趣包括我的iPhone好友,所以我希望使用HTML5,Javascript和PHP在网络上构建它。

我尝试了一些不同的方法,比如BeaconPush和不断读/写MySQL数据库,但我不确定最佳和最有效的方法。我开始编写一堆代码,然后发现问题并尝试另一条路线,似乎不断碰到我的脑袋。

游戏有点像吃豆人。三名球员试图“抓住”一名球员。一个玩家在真实世界的地图上有一个特定的目标。游戏从数据库中获取坐标并将对象/图标生成到Google地图上。使用navigator.geolocation.watchPosition,游戏会检查物品的命中检测,并且玩家可以在物品经过时检索物品。所有这一切都很好,但地图必须能够更新对象图标,并在近实时更新其他玩家的位置图标。我不确定如何以最有效的方式分享每个人的GPS位置。整个游戏基本上都在运作和工作,除了这个(虽然是巨大的)拼图。

感谢任何指导!

1 个答案:

答案 0 :(得分:3)

好的,您的问题是如何在近乎实时的情况下在SERVER和多个CLIENT之间进行有效通信。您有两个问题,即与客户进行有效沟通。并且在服务器上的“会话”之间进行有效的通信。

HTTP客户端服务器

http协议不是有状态的。这意味着您发送服务器响应的请求,然后关闭连接。这使得难以像游戏需求那样以双向或事件驱动的方式进行通信。这就是为什么大多数网络游戏使用UDP,其发送信息的开销要少得多。 我们必须使用TCP / IP,我们必须在这种情况下使用HTTP协议,那么我们如何才能有效地做到这一点?

彗星是答案。 Comet Server只是一个“术语”,意味着服务器可以长时间保持连接打开,以便不断向客户端发送数据。 Comet服务器使用异步流(ajax)连接,允许客户端“知道”何时到达新信息而无需读取整个响应。 另见:长轮询 PHP Comet Server

会议后续会议

当服务器收到请求时,需要询问“其他人在哪里”的问题,并且需要经常有效地提出这个问题。 对于像这样的东西,Mysql不会是最好的技术解决方案。您希望从多个进程(每个http客户端)非常快速地编写和读取小值

为什么要通过网络连接发送数据,从字符串(sql)解码数据,然后等待服务器解码插入或响应等等 - 所有这听起来都是额外的开销。

您需要的是真正的IPC(进程间通信)。这在PHP中很难实现,但可以做到。使用共享内存,甚至写入内存映射文件将是读取和写入GPS坐标更新率最高的最佳解决方案。 PHP IPC

将它们绑在一起:

客户端向服务器发送请求并开始轮询它。服务器读取共享内存以查看其他人的坐标。服务器将一行写入打开的连接,该连接包含描述所有玩家位置的JSON字符串。 在客户端轮询服务器的同时,它还必须向服务器发送描述其位置的请求,并且服务器必须将此值写入共享内存。 程序保持连续循环,直到客户端关闭http连接。

见这些:

如果共享内存不是一个选项,那么我建议使用不同的数据库或更简单的东西,如键值存储(memcache)甚至mongodb。它们都具有较少的事务开销,并且能够比MySQL更快地插入和轮询

第三种选择是使用PostgreSQL作为IPC机制。你可以使用LISTEN事件 - 但这有点做作。

注意:

使用PHP,此解决​​方案无法很好地扩展。假设您正在使用Apache,并且您的工作池中有20名工作人员。当你达到20个连接时,所有服务器的php进程都将被其他请求消耗,因此第21个请求将无休止地等待一个worker变为可用。

最好的解决方案是在Twisted或任何其他异步框架中实现Comet服务器/长轮询。