我正在开发一个使用 Node.js 作为服务器的多人游戏。目前它只是一个 2D 三角形,玩家可以在屏幕上行驶。游戏循环在服务器上运行并将游戏世界状态的更新发送到客户端。客户端有一个正在运行的绘制循环,它使用更新的位置和方向将三角形绘制到画布上。
问题:
我在绘制循环中使用了间隔为 30 毫秒的 setInterval。但是,游戏的动作可能会变得相当紧张。我试过测量从一个循环开始到下一个循环所花费的时间,如下面的代码所示。结果表明,循环之间的时间介于 1ms 到 200ms 之间。
控制台输出示例:
looptime: 59
looptime: 14
looptime: 22
looptime: 148
looptime: 27
我在客户端运行的唯一其他事情是 onkeyup/onkeydown 侦听器和 socket.io 侦听器,用于将数据发送到服务器。任何帮助深表感谢。
代码:
...
function init(){
var canvas = document.getElementById('canvas');
if(canvas.getContext){
setInterval(draw, 30);
}
}
function draw(){
timeNow = new Date().getTime();
console.log('looptime: '+(timeNow-startDrawTime));
startDrawTime = new Date().getTime();
var ctx = document.getElementById('canvas').getContext('2d');
triX = tri.pos.x;
triY = tri.pos.y;
ctx.save();
ctx.clearRect(0,0,400,400);// clear canvas
ctx.save();
ctx.translate(triX, triY);
ctx.rotate(tri.orientation);
ctx.save();
ctx.beginPath();
ctx.arc(0,0,5,0,Math.PI*2, true);
ctx.stroke();
ctx.restore();
//draw tri
ctx.save();
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.moveTo(0, -5);
ctx.lineTo(5, 5);
ctx.lineTo(-5, 5);
ctx.closePath();
ctx.fill();
ctx.restore();
ctx.restore();
ctx.restore();
//console.log('looptime: '+((new Date().getTime())-time));
}