【发布时间】:2011-06-26 08:10:26
【问题描述】:
如果我在画布上快速连续绘制很多东西,例如循环中的 context.fillRect,浏览器似乎要等到循环完成后才会显示任何绘图(可能通过双缓冲)
有什么方法可以强制浏览器在每次绘制操作后显式或隐式更新显示?
【问题讨论】:
如果我在画布上快速连续绘制很多东西,例如循环中的 context.fillRect,浏览器似乎要等到循环完成后才会显示任何绘图(可能通过双缓冲)
有什么方法可以强制浏览器在每次绘制操作后显式或隐式更新显示?
【问题讨论】:
实际上并不是因为任何双缓冲导致您看不到结果,而是因为 Web 浏览器中的 JavaScript 是单线程的。如果您在 JavaScript 中类似地创建一个循环,重复执行类似myDiv.style.top = parseInt(myDiv.style.top) + 1 +"px"; 之类的操作,您将看到浏览器中没有任何明显变化——即使在几秒钟内——直到您的 JavaScript 完成执行。
要绘制更改并在屏幕上查看结果,您需要使用setInterval 或setTimeout 将控制权交还给浏览器,但要求在未来某个时间点运行代码。
例如,每秒 15 次在画布上绘制一个新的随机、随机颜色的矩形:
var canvas = document.getElementsByTagName('canvas')[0];
var ctx = canvas.getContext('2d');
setInterval(function(){
ctx.clearRect(0,0,canvas.width,canvas.height);
var r=Math.random()*255, g=Math.random()*255, b=Math.random()*255;
ctx.fillStyle = 'rgb('+r+','+g+','+b+')';
var w=Math.random()*canvas.width, h=Math.random()*canvas.height;
var x=Math.random()*(canvas.width-w), y=Math.random()*(canvas.height-h);
ctx.fillRect(x,y,w,h);
},1000/15);
【讨论】:
最好使用window.requestAnimationFrame() 以获得更好的浏览器行为。
【讨论】:
requestAnimationFrame 几乎不存在。你的答案只是一点点......我们说没时间了