我正在開發一個使用Node.js作爲服務器的多人遊戲。目前它只是一個2D三角形,玩家可以在屏幕上行駛。遊戲循環在服務器上運行,並將遊戲世界狀態的更新發送給客戶端。客戶端有一個繪製循環運行,使用更新的位置和方向將三角形繪製到畫布上。用於遊戲繪製循環的Javascript setInterval不一致運行
問題:
我已經使用的setInterval與拉伸環的30毫秒間隔。然而,遊戲的運動會變得相當不安。我試過測量從一個循環開始到下一個循環的時間,如下面的代碼所示。結果顯示,循環之間的時間在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));
}
認爲''save''和'restore'調用對性能來說真的很糟糕,實際上在代碼中確實需要它嗎? – Delta