实时浏览器游戏服务器
Posted
技术标签:
【中文标题】实时浏览器游戏服务器【英文标题】:Real time browser game server 【发布时间】:2009-12-31 03:21:25 【问题描述】:我主要是在寻找设置建议和有关如何进行此操作的指示。我会尽可能详细地解释我能想到的,并指出可能可行的方法。
这样做的目的是创建一个实时浏览器游戏,我发现满足我需求的最佳方法是使用带有 ajax 的“长轮询”,它基本上会向服务器设置一个“挂在那里”的请求" 直到服务器有东西要发送,然后在收到更多数据后重新建立连接。出于我的目的,这将处理聊天系统以及角色移动,即:如果玩家进入同一区域,那里的客户端将收到通知通知他们的响应,从而更新浏览器客户端以显示这一点。
上面的实现相对容易,我已经为它做了一个测试用例,但是我想改进它,在服务器端它会运行一个循环 X 时间,然后它会自动超时和发回空字符串,以便可以建立另一个连接,这是为了防止无限循环并在不应该的情况下耗尽资源。我没有在每个循环周期(我相信会很昂贵)查找需要发送到客户端的消息的数据库,而是使用平面文件,如果文件的修改时间戳大于发送到客户端的最后一条消息,那么有新的东西要发送。但是,我相信如果每秒执行几次,这也会很昂贵(虽然不如使用 mysql 数据库?)。
我对此的想法是让一个 C++ 程序(为了速度)不断运行,并使用它在内存中非常快速地查找新消息等等,这也将给我带来额外的好处,即能够拥有服务器可以控制游戏中的机器人以获得更实时的感觉/方法,但是我不知道这是否可能,而且我在谷歌上的搜索没有结果。
我最想做的方法是继续使用 php 来进行页面的渲染和控制等,并将 ajax 请求发送到 C++ 应用程序(将始终运行)可以处理所有实时方面。
CGI 违背了上述方法的目的,因为它在每个请求上创建一个新的应用程序实例,这既慢又完全是我不想要的,我有 php 并且不想切换一个完美运行另一种更适合的语言,但是 PHP(据我所知)无法将内容存储在内存(ram)中,所以第四个。
我想到的另一种方法是使用 php 套接字连接到 C++ 应用程序,尽管我不知道这有多可行。 C++ 应用程序基本上只需要控制机器人 (AI) 和聊天系统消息。我完全不知道如何通过 PHP 处理机器人。
我希望这完全解释了我的意图和目标,所以如果有人有任何指示或建议,请回复并帮助我,将不胜感激。如果您需要任何额外的信息(如果我没有很好地介绍某事或某事),那么我很乐意尝试更好地解释。
【问题讨论】:
【参考方案1】:反应需要多快?对于任何接近实时动作游戏的东西,AJAX/Comet 都太慢了。开销也很令人沮丧。
这种事情的前进方向可能是WebSocket,在后端有一个自定义服务器。但我认为这并不意味着您需要为此求助于 C[++];瓶颈很可能是网络,而不是服务器处理器能力。
我正在使用带有简单消息复制系统的 Python SocketServer — 在我的案例中,所有游戏逻辑都在客户端,一些复杂的 javascript 在面对延迟时保持一致的游戏世界 — 但即使是更复杂的服务器端,我认为脚本语言可能就可以了。
WebSocket 还没有准备好;没有主流的浏览器实现。与此同时,我正在使用模拟 WebSocket 接口的 Flash Socket 备份。 Flash Sockets 有自己的问题,它们无法协商代理,但它们速度很快,希望随着 WebSocket 正确到达,对它们的需求会减少。
【讨论】:
我研究了彗星,并认为它们太局限了,我看到了一个名为 Travians 的 RPG 游戏的长轮询工作(它连接到端口 8010 上的 IP 地址)。脚本语言的问题在于它不是持久的(我相信这是正确的词?详细说明它不是不断运行的,所以用它处理机器人状态会是一个问题?)为了进一步解释 travians 方法,他们的长轮询接收客户端上的 JS 进一步处理的命令字符串,例如它将接收“MoveChar.1 f
(在游戏帧 15 按下左键)。
我没有使用 python 的经验,这就是我最初选择 C++ 的原因,我是否必须在每个 ajax 请求上使用 php 套接字并以这种方式连接到 C++ 应用程序?
如果你是通过网络服务器做的,是的,但你通常不希望通过普通网络服务器+PHP设置来做长轮询代码,因为你会有很多很多并发PHP 坐着浪费资源。如果你有一个 C++ 套接字服务器后端,最好让 web 客户端直接连接到套接字服务器,而不需要 webserver/PHP 层。这意味着 C++ 服务器必须有效地成为自己的 Web 服务器,这就是使用更高级别的脚本语言会让您的生活更轻松的地方。
一旦你到了那个位置,你还可以考虑使用 WebSocket 和/或 Flash Socket 方法连接到可用的套接字服务器,因为这将比长轮询响应更快. WS/Flash 接口也比完整的 AJAX/Web 服务器更容易实现。【参考方案2】:
阅读您的帖子会敲响警钟。
您对多线程代码的熟悉程度如何?用 C++?如果答案是“不是非常”,那么我担心你可能会咬掉一大块。为什么不利用一些现有的(经过试验和测试的)COMET 服务器实现而不是这种准系统方法?无论您想到什么应用程序,它都应该与通信实现完全分开。
作为已经实现了这样一个服务器的人,我可以告诉你,它需要多次设计迭代和很长时间才能做到正确。实际测试这样的产品也是一个非常棘手的过程。
【讨论】:
老实说,我认为不需要完全多线程,原因是我玩 MUD 游戏的经验(玩家将通过 telnet 连接到那些游戏),服务器不是多线程的(仅 DNS 查找),我认为让玩家在自己的线程中会是矫枉过正,并且阻碍性能超过收益,因为 bobince(下)提到我的主要瓶颈将是网络。 如果你打算用 C++ 编写游戏服务器,因为它速度很快,那么你最好熟悉多线程/并发来处理网络 IO 方面的事情。将有共享状态,很可能会在由/驱动网络 IO 驱动的不可预测的时间访问。非线程方法会......很差。我不提倡每个线程一个播放器,但 IO 并发发生的事实是不可避免的,如果速度很重要,则需要解决。 你可以在没有线程的情况下很好地完成异步 IO。它是最合适还是最简单的编码方式是有争议的,但有主要的网络框架和服务器采用这种方式。以上是关于实时浏览器游戏服务器的主要内容,如果未能解决你的问题,请参考以下文章