Node.js をサーバーとして使用してマルチプレイヤー ゲームを開発しています。現時点では、プレイヤーが画面上を移動できるのは単純な 2D の三角形です。ゲーム ループはサーバー上で実行され、ゲーム ワールドの状態の更新をクライアントに送信します。クライアントは、更新された位置と方向を使用して三角形をキャンバスに描画する描画ループを実行しています。
問題:
描画ループに 30 ミリ秒の間隔で setInterval を使用しました。ただし、ゲームの動きはかなりぎくしゃくすることがあります。以下のコードに示すように、あるループの開始から次のループまでの時間を測定してみました。結果は、ループ間で 1 ミリ秒から 200 ミリ秒かかることを示しています。
コンソール出力の例:
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));
}