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这似乎已经解决了这个问题。谢谢!刚刚添加了一个真实的答案,以防其他人发现这个问题有用。好吧!谢谢!