【问题标题】:PHP AJAX Multiplayer GamePHP AJAX 多人游戏
【发布时间】:2011-10-11 18:39:47
【问题描述】:

我正在计划一个相对简单的在线多人游戏,但我不知道用什么来进行玩家之间的交流。

游戏详情:

  • 6 名玩家
  • 聊天框
  • 30 秒回合(中场休息)
  • 时间同步很重要

玩家选择并采取行动,在回合结束时执行行动,详细行动有一个短暂的中场休息,新的回合开始。

我决定完全用 JS 和 PHP(当然是 AJAX)来构建这个游戏。我只是不知道我应该使用什么来进行客户端到客户端的通信 - 我最初计划使用 mySQL 对 PHP 脚本使用持续 1/2 秒的 AJAX 调用来存储游戏/用户数据,但恐怕那会太慢且不可预测。

我考虑过使用类似 XML 的东西而不是 mySQL,并使用类似 php fopen() 函数的东西——你们怎么看?

我在这个问题here 中看到,发帖者正在考虑使用 XMPP,这会是一个好的解决方案吗?

我应该去买一个插座吗?对于不需要交换那么多数据的游戏来说,这是否必要?要做到这一点需要什么?

关于同步回合时间有什么建议吗?或者这是我真正需要关心的事情吗?

我愿意接受所有建议,非常感谢我能得到的任何帮助。

【问题讨论】:

    标签: php ajax sockets multiplayer


    【解决方案1】:

    如果您决定使用 PHP/JS/Ajax,那么我建议您阅读有关使用 PHP usleep() 函数延迟返回 ajax 调用结果直到服务器有话要说的内容。这应该会导致服务器到客户端的通信速度更快。

    我自己没有做过,但我认为基本原则是每次ajax调用可以延迟5到10秒,每次超时或从服务器返回数据时执行新调用。

    另外,我会推荐一个 javascript 框架(例如jQuery)以使 ajax 调用更易于管理。

    【讨论】:

    • 谢谢,我去看看。是的,现在 jQuery 是一个给定的,但出于性能考虑,我仍然可能会选择我自己的一组专门的函数,因为我可能不需要 jQuery 提供的所有功能。您如何看待 XML vs mySQL vs???
    • XML vs MySql?它们到底有什么关系??
    【解决方案2】:

    去彗星,你不需要插座。 Comet 是一种反向 AJAX。例如,对于即时消息之类的 p2p 服务非常适用,因为它将数据推送到浏览器,而浏览器无需不断地轮询服务器。在 JS/PHP 中有很多 Comet 的实现,只是谷歌而已。然后,作为后端,你可以使用 MySQL 或 XML 或任何你想要的(但我认为 MySQL 是一个更好的解决方案,因为 XML 只是一个需要打开、读取、写入和关闭的文本文件,并且设计了数据库比那更快)。

    【讨论】:

    • Re: DB vs XML - 没有 XML 服务器,不像 DB 本身就是服务器。这意味着访问 XML 文件时会出现死锁,这与 DB 不同。
    • 这听起来和我正在寻找的完全一样,但是,我正在考虑使用 jQuery,似乎大多数人都在使用 Dojo 或原型 - 有什么建议吗?
    • @christian-sciberras 是的,这是另一个缺点。我在 2008 年使用 Prototype 来实现 Comet。我想 jQuery 也做了类似的工作。
    • 我发现 CometD 扩展了 jQuery 以使用它,看起来这对我有用。但我的下一个问题是处理多个游戏室——这需要不同的连接、端口等吗?有人知道吗?
    • 嗯,您可以发送额外的房间 ID,它们可以通过 PHP 脚本进行管理并存储在数据库中。然后,您只需将相关 ID 推送到相关客户端(使用 ID 连接到脚本)。当然这不够安全,但我想会话、cookie、令牌等有很多选项......
    【解决方案3】:

    我也在用 JS/PHP 构建一个游戏,这是我的计划:在服务器上有一个纯文本文件。每当用户执行需要发送到服务器的操作时,它就会向 php 脚本发送一个 XMLHttpRequest,该脚本将该操作附加到文件中(例如,如果用户从迈阿密向莫斯科发射导弹,它会写下“launch Miami莫斯科”到文件中)。要检查其他人何时执行某项操作,您可以在不同的 PHP 脚本上打开一个 XMLHttpRequest,当 PHP 脚本返回某些内容时,您记录它返回的内容并重新打开连接。该 PHP 脚本检查对文件的修改,并在文件内容发生更改时返回文件内容。这是检查更改的 PHP 文件:

    <?php
    #First, set infinite time limit
    set_time_limit(0);
    #record last modification time
    $f1=filemtime('./nameoffile.txt');
    #wait until the file changes
    while($f1===filemtime('./nameoffile.txt'){
        #have a 10,000 microsecond break between each check so you do not use too much resources
        usleep(10000);
    readfile('./nameoffile.txt');
    ?>
    

    您可能还想研究 HTML5 WebSockets。我不使用它们,也不知道它们是否适用于 PHP,但它们看起来很有趣。

    【讨论】:

    • Websockets 可以和 PHP 一起工作,但是很多主机不允许你打开端口,所以不允许使用 websocet。 Websocket 在最小化延迟方面要好得多,像slither.ioagar.io 这样的许多游戏都使用 WS
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多