Canvas Firefox 下动画闪烁
Canvas animation flickering under Firefox
无论我做什么,我都无法在 Firefox 下获得流畅的 canvas 动画。我什至设置了一个简单的测试代码,它除了每 1/40 秒调用一次空绘制函数之外什么都不做,它仍然在闪烁。
var t = 0;
function draw(time)
{
console.log(Math.round(time - t));
t = time;
}
setInterval(function(){ requestAnimationFrame(draw); }, 25);
Firefox 下帧之间的延迟有时会跳到超过 150 毫秒,这很容易被人眼注意到。当使用简单的 setInterval
调用 draw()
而没有 requestAnimationFrame
时,也会发生同样的事情。它在 Chrome 和 Opera 下完美运行。
我也试过去掉 setInterval
,结果是一样的:
var t = 0;
function draw(time)
{
requestAnimationFrame(draw);
console.log(Math.round(time - t));
t = time;
}
draw();
这是一个已知问题吗?有什么办法可以解决这个问题吗?
原来 requestAnimationFrame
在 Firefox 下的当前实现很糟糕,并且在从计时器或网络事件(即使是那些以固定间隔重复的事件)调用时无法提供流畅的动画。
这使得在通过 websocket 连接更新状态时难以重绘 canvas。获得流畅动画的唯一方法是立即调用 requestAnimationFrame
:
(function draw()
{
requestAnimationFrame(draw);
// do something
})();
使用此方法时,实施某种帧插值通常是个好主意,因为 draw()
调用不会与网络事件同步。
无论我做什么,我都无法在 Firefox 下获得流畅的 canvas 动画。我什至设置了一个简单的测试代码,它除了每 1/40 秒调用一次空绘制函数之外什么都不做,它仍然在闪烁。
var t = 0;
function draw(time)
{
console.log(Math.round(time - t));
t = time;
}
setInterval(function(){ requestAnimationFrame(draw); }, 25);
Firefox 下帧之间的延迟有时会跳到超过 150 毫秒,这很容易被人眼注意到。当使用简单的 setInterval
调用 draw()
而没有 requestAnimationFrame
时,也会发生同样的事情。它在 Chrome 和 Opera 下完美运行。
我也试过去掉 setInterval
,结果是一样的:
var t = 0;
function draw(time)
{
requestAnimationFrame(draw);
console.log(Math.round(time - t));
t = time;
}
draw();
这是一个已知问题吗?有什么办法可以解决这个问题吗?
原来 requestAnimationFrame
在 Firefox 下的当前实现很糟糕,并且在从计时器或网络事件(即使是那些以固定间隔重复的事件)调用时无法提供流畅的动画。
这使得在通过 websocket 连接更新状态时难以重绘 canvas。获得流畅动画的唯一方法是立即调用 requestAnimationFrame
:
(function draw()
{
requestAnimationFrame(draw);
// do something
})();
使用此方法时,实施某种帧插值通常是个好主意,因为 draw()
调用不会与网络事件同步。