画布动画效果不佳.我能做什么

Canvas animation doesnt work fluently. What can i do?

本文关键字:什么 布动画 动画      更新时间:2023-09-26

由于我为电荷随机不透明度值添加了o: Math.random()*(1 - 0.1) + 0.1 //opacity,因此动画无法正常工作。我能做些什么来防止这种情况发生?如何使我的剧本更有效地与表演相关?

window.onload = function () {
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var W = canvas.width = window.innerWidth;
    var H = 550;
    var mp = 45; //max particles
    var particles = [];
    //var rotate = 180;
    reqAnimFrame = window.requestAnimationFrame ||
                   window.mozRequestAnimationFrame    ||
                   window.webkitRequestAnimationFrame ||
                   window.msRequestAnimationFrame     ||
                   window.oRequestAnimationFrame;
    for ( var i = 0; i < mp; i++ )
        {
            particles.push({
                x: Math.floor(Math.random()*W), //x-coordinate
                y: Math.floor(Math.random()*H), //y-coordinate
                d: Math.floor(Math.random()*(12 - 1) + 1), //density
                r: Math.floor(Math.random()*(70 - 10) + 10), //radius
                o: Math.random()*(1 - 0.1) + 0.1 //opacity
            })
        }

    function animate() {
        reqAnimFrame(animate);
        for ( var i = 0; i < mp; i++ )
            {
                var p = particles[i];
                p.x += p.d;

                if(p.x >= W + p.r){
                    p.x = -300;
                    p.y = Math.floor(Math.random()*H);
                }
                draw();
            }
    }
    function draw() {
        ctx.clearRect(0, 0, W, H);
        for ( var i = 0; i < mp; i++ )
            {
                var p = particles[i];
                ctx.fillStyle = "rgba(51,51,51," + p.o + ")";
                ctx.beginPath();
                ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2, false);
                ctx.fill();
                //ctx.moveTo(p.x,p.y);
                //ctx.lineTo(p.x + 150, p.y + (-180));
                //ctx.lineTo(p.x + 300, p.y);
            }    
    }
    animate();
    };//onload function

我制作jsfiddles onetwo

在第一小提琴中并没有closePath函数调用,在第二小提琴中它调用。

在第一小提琴devtools时间线显示额外的内存使用7 MB每秒(在你的情况下,调用CG 1秒后,IMHO):从10 MB到17 MB

在次要时间线中,显示从beginPathclosePath函数的额外内存使用量2MB(接近130ms):从10MB到12MB。但在这种情况下,CG不会打电话。

我认为最好添加closePath函数,以防止GC调用。旧浏览器使用较少的粒子数,因为对我来说(MacBook Pro、Chrome)一切都很好,fps为60(最高)。

您在更新循环中为每个粒子调用draw一次,这会导致mp*mp成本而不是mp成本
首先要做的是每个粒子只调用draw一次,所以不要在更新循环中调用它,而是在更新结束时只调用一次。

请注意,您可以通过更改上下文的globalAlpha而不是创建新颜色来获得一些性能。