Javascript 在画布上绘图时,滚动有1/10的可能性会导致页面延迟
我发现有时当我使用滚轮时,画布会停止绘制。我试图禁用滚动,但问题仍然存在 以下是滞后的一个例子: 代码如下:Javascript 在画布上绘图时,滚动有1/10的可能性会导致页面延迟,javascript,canvas,Javascript,Canvas,我发现有时当我使用滚轮时,画布会停止绘制。我试图禁用滚动,但问题仍然存在 以下是滞后的一个例子: 代码如下: var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); c.width = getWidth(); c.height = getHeight(); var iconNames = ['android', 'github', 'google-plu
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
c.width = getWidth();
c.height = getHeight();
var iconNames = ['android', 'github', 'google-plus', 'instagram', 'linkedin', 'pinterest', 'reddit', 'skype', 'snapchat', 'soundcloud', 'tumblr', 'twitter', 'vimeo', 'youtube'];
var iconsDropped = 0, max = 7;
var drops = [];
for (var i = 0; i < iconNames.length; i++) {
var image = new Image();
image.src = "images/landing/" + iconNames[i] + ".png";
}
pickRandom();
function pickRandom() {
var wait = Math.floor(Math.random() * 2500);
setTimeout(pickRandom, wait);
if (iconNames.length < 1 || iconsDropped >= max) {
return;
}
var img = new Image();
var index = Math.floor(Math.random() * iconNames.length);
var name = iconNames[index];
iconNames.splice(index, 1);
img.onload = function () {
drops.push({
image: img,
width: Math.floor(Math.random() * getWidth()),
height: -50,
name: name,
speed: Math.random() + .5,
cycle: 0
});
iconsDropped++;
};
img.src = "images/landing/" + name + ".png";
}
function draw() {
c.width = getWidth();
c.height = getHeight() - c.offsetTop;
clearCanvas();
for (var i = 0; i < drops.length; i++) {
var drop = drops[i];
drop.height = drop.height + drop.speed;
if (drop.height > getHeight() - c.offsetTop) {
drop.cycle++;
if (drop.cycle == 3) {
var name = drop.name;
drops.splice(i, 1);
iconNames.push(name);
iconsDropped--;
i--;
continue;
} else {
drop.height = -50;
drop.width = Math.floor(Math.random() * getWidth());
}
}
ctx.drawImage(drop.image, drop.width, drop.height, 50, 50);
}
console.log("ASD")
}
setInterval(draw, 2);
function clearCanvas() {
ctx.clearRect(0, 0, c.width, c.height);
ctx.beginPath();
}
执行自定义动画时,应使用而不是setInterval或setTimeout。这是为了让浏览器知道您正在尝试制作动画,并且能够在滚动、将窗口置于背景等方面满足这一要求 根据文件: 当您准备在屏幕上更新动画时,应该调用此方法。这将要求在浏览器执行下一次重新绘制之前调用动画函数。回调次数通常为每秒60次,但根据W3C建议,通常与大多数web浏览器中的显示刷新率相匹配。在后台选项卡或隐藏窗口中运行时,回调速率可能会降低到较低的速率,以提高性能和电池寿命
你试过使用requestAnimationFrame而不是setInterval吗?@MattWay这似乎已经解决了这个问题。谢谢!刚刚添加了一个真实的答案,以防其他人发现这个问题有用。好吧!谢谢!