2013-01-19 47 views
1

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

准备就绪后,游戏开始。游戏Algorthim会这样。
每50毫秒PHP多人游戏:数据同步无法正常工作

  1. 计算自己的位置(X,Y)
  2. 获取对手的角度(AJAX),并计算出对手的POS(X2,Y2)
  3. 画布和更新然后画数据库。

    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的屏幕 Player 1 in one computer

玩家2的屏幕 Player 2

+1

看来,阿贾克斯请求搞砸了整个事情。你每隔50毫秒发送一次请求!尝试提高那个时间,虽然可能不是你喜欢做的事情,但你可以试试websocket来获得这个“实时”,并特别看看socket.io库。 – Gntem

+0

@GeoPhoenix我使用getAngle()和updateRound()函数在循环之外并将时间提高到10ms。结果比上面的要好得多。不过,角度的细微差别会产生不同的结果。 –

回答

4

你的脚本不运行每隔50ms - 因为它是只设置一次,其他所有功能都运行超时。根据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 

因此,这些例子的时序,你的循环后,才〜306ms运行。

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

+0

是的。感谢您的演示。这可能是问题。但我从来没有使用websockets。你能给我一个链接,了解websockets吗? –

+0

https://developer.mozilla.org/en-US/docs/WebSockets –

+0

在所有浏览器中都支持Websockets吗?特别是在IE? –

1

我终于找到了解决方案Node.JSSocket.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。这很棒。