【问题标题】:PHP multiplayer game: data synchronization doesn't work properlyPHP多人游戏:数据同步无法正常工作
【发布时间】:2013-01-19 22:38:44
【问题描述】:

我正在使用 Canvas 和 MySQL 数据库在 PHP 中开发多人游戏。 两名玩家加入游戏,他们首先获得对手的位置(X,Y 和角度)。

当他们准备好时,游戏开始。游戏算法是这样的。
每 50 毫秒

  1. 计算自己的位置(X,Y)
  2. 获取对手的角度(AJAX)并计算对手的位置(X2,Y2)
  3. 然后在 Canvas 上绘制并更新数据库。

    context.fillStyle = "green";
    context.fillRect(p1.x,p1.y, 5,5);
    addPoints(p1.x,p1.y);
    updateRoundJQ(p1.x,p1.y,p1.a);
    
    context.fillStyle = "red";
    context.fillRect(x2,y2, 5,5);
    addPoints(x2,y2);
    
    loopTimer = setTimeout('drawLine()', 50);
    

但不幸的是,我得到了这个结果。接收数据有很大延迟。谁能帮助我如何摆脱这个巨大的错误?真的会很感激。

玩家 1 的屏幕

玩家 2 的屏幕

【问题讨论】:

  • 似乎 ajax 请求搞砸了整个事情。您每 50 毫秒发送一次请求!尝试提高那个时间,虽然可能不是你喜欢做的事情,你可以尝试 websockets 来获得“实时”,特别是看看 socket.io 库
  • @GeoPhoenix 我将 getAngle() 和 updateRound() 函数放在循环之外,并将时间提高到 10 毫秒。结果比上面的要好很多。然而,角度的微小差异会产生不同的结果。

标签: php ajax canvas multiplayer


【解决方案1】:

您的脚本不是每 50 毫秒运行一次 - 因为它只是在所有其他函数都运行后才设置超时。根据updateRound 的工作方式,这可能会将往返时间添加到每个间隔。

例如,考虑以下时序:

context.fillStyle = "green"; // 1ms
context.fillRect(p1.x,p1.y, 5,5); // 1ms
addPoints(p1.x,p1.y); // 1ms
updateRoundJQ(p1.x,p1.y,p1.a); // web request? 300ms

context.fillStyle = "red"; // 1ms
context.fillRect(x2,y2, 5,5); // 1ms
addPoints(x2,y2); // 1ms

loopTimer = setTimeout('drawLine()', 50); // wait 50ms from now

因此,使用这些示例计时,您的循环将仅在 ~306 毫秒后运行。

可能值得考虑使用 websocket 将数据推送到您的客户端,而不是使用 AJAX 拉取数据。

【讨论】:

  • 是的。感谢您的演示。这可能是问题所在。但我从未使用过 websockets。你能给我一个链接来了解 websockets 吗?
  • 所有浏览器都支持 Websockets 吗?尤其是在 IE 中?
  • 我不确定 - 你必须谷歌它。我们在这里讨论另一个问题。
  • 我得到了一个使用 websocket 的解决方案。它完美地工作。再次感谢。
【解决方案2】:

我终于找到了使用 Node.JS Socket.IO 的解决方案。 该解决方案将比在 AJAX 中简单得多。

  //Client Side Request   
  function sendMyPoints(){
       socket.emit('myPoints',p1.x,p1.y);
  }

  //Server Handles the Request 
  socket.on('myPoints',function(xP, yP){
    socket.broadcast.emit('getOppPoints',xP,yP);
  });

  //Client gets the Response
  socket.on('getOppPoints',function(xPos,yPos){
      drawOppPoints(xPos, yPos);
  });

感谢您推荐 Websocket。太棒了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多