如何使fps在不同客户端以相同的速度运行

时间:2016-04-17 04:17:55

标签: javascript node.js html5 time socket.io

服务器和客户端都有代码

 setInterval(function(){ 
    player.x++;
    player.y++;
}, 20);

我有一个node.js / socket.io服务器,其中每个帧都会更新播放器的x和y并发送给客户端。客户端也使用相同的逻辑更新不同的x和y。客户似乎比服务器移动速度更快,因此它使游戏不同步。我应该做什么不同的做法?

2 个答案:

答案 0 :(得分:0)

这是一个庞大而复杂的话题,我没有心情为你辩论这些主题;但有一些提示/方向。
这不是一个完整的答案,但更多的解释,一个评论可以采取。

第一:不要在后面和后面增加值。 将它们定义为动画:{ startTime, startValue, endTime, endValue }。现在,您可以随时插入当前位置,与间隔无关。

第二:你必须考虑前端和后端之间的时间偏移。

第3步:检查前端是否操作了计时器:这是一种常见的作弊行为。不要把时钟的正确性视为理所当然。

第4:你还必须考虑ping,例如,当从前端接收动作时,你应该减去ping以知道动作何时真正发生。并且不要忘记一遍又一遍地检查ping:它可能会随着时间的推移而改变。 而且,你只能相信自己的时钟,你应该检查操作(例如,人为地减慢连接速度)。谷歌ping-cheater,...

最后:你并不是第一个创造实时游戏的人。搜索这些主题,它们已经解决,并且过去曾被其他人询问过。
特别是在flash社区中搜索。 Flash仍然是一个流行的游戏平台,AS3代码应该很容易理解并移植到JS。

答案 1 :(得分:0)

实际上真的很容易,任何有同样问题的人都读过这篇文章。 https://www.viget.com/articles/time-based-animation

最简单的方法是根据自上次移动以来已经过了多长时间而移动"所以只需通过从time_then中减去time_now来找到deltaTime变量。

这就是我的updatePosition函数现在的样子

self.updatePosition = function(){
            var now_time = (new Date).getTime();
            var delta_time = now_time - self.then_time;
            self.x += delta_time * self.velocityX;
            self.y += delta_time * self.velocityY;
            self.then_time = now_time;
        }

只需在初始化中设置then_time,或者在角色首次开始移动时设置。