私は、canvas要素を多用するHTML5ゲームに取り組んでいます。メインのcanvas要素を更新する継続的なイベントループがあり、定期的に大きな変更を加える必要があります。基本的に、キャラクターが動き回ると、背景が更新されます。これが発生すると一時停止が目立つので、非同期機能で操作を実行しようとしましたが、まったく同じパフォーマンスヒットを取得しているようです。非同期関数で非表示のキャンバスに対してすべての操作を実行し、それらが完了したときにイベントループの後半でメインキャンバスにコピーしようとしましたが、パフォーマンスは向上しませんでした。
私が話している振る舞いを複製しているように見えるこの無意味な小さなプログラムを書きました。非同期関数であっても、canvas要素を拘束すると、プログラムの残りの部分に影響を与えるように見えます。
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var ImDat=ctx.createImageData(1000,1000);
var ticker = 0;
ImDat.setPixel=function(x,y,c){
var i=(x+y*this.width)*4;
this.data[i]=c.R;
this.data[i+1]=c.G;
this.data[i+2]=c.B;
this.data[i+3]=c.A;
}
var bigOperation = function() {
for (var i = 0; i < 20; i++) {
lilOperation();
}
console.log(new Date + 'big op done');
}
var lilOperation = function() {
for (var i = 0; i < canvas.width; i++) {
for (var j = 0; j < canvas.height; j++) {
ImDat.setPixel(i, j, { R: Math.random() * 256, G: Math.random() * 256, B: Math.random() * 256, A: 256 });
}
}
ctx.putImageData(ImDat, 0, 0);
}
var eventLoop = function() {
if (ticker == 50) {
ticker = 0;
console.log(new Date + 'big op start');
window.setTimeout(bigOperation, 1);
} else {
ticker++;
}
lilOperation();
console.log(new Date + 'normal loop');
}
window.setInterval(eventLoop, 10);
したがって、bigOperation関数が呼び出されるまで、一貫した時間間隔がログに記録され、その時点でイベントループが一時停止します。私はかなりくだらないシステムでこれに取り組んでいるので、効果を得るためにbigOperationの反復回数を増やす必要があるかもしれないことに注意してください。
ありがとう!