我正在开发一个大量使用 canvas 元素的 HTML5 游戏。有一个持续的事件循环更新主画布元素,然后需要定期对其进行重大更改。基本上,随着角色四处移动,背景会更新。发生这种情况时会出现明显的停顿,因此我尝试使用异步函数执行操作,但我似乎受到了完全相同的性能影响。我已经尝试在异步函数中对不可见的画布执行所有操作,然后在事件循环中完成后将其复制到主画布,但同样没有提高性能。
我编写了这个荒谬的小程序,它似乎重复了我正在谈论的行为。似乎捆绑画布元素,即使在异步函数中,也会影响程序的其余部分。
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 中的迭代次数才能获得效果。
谢谢!