javascript canvas fps 帧速率计算

本文介绍如何使用HTML5 Canvas API实现简单的动画效果,包括球体的移动、碰撞反弹及颜色渐变等特性。通过JavaScript代码控制帧率,实现了流畅的动画演示,并提供暂停与播放功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d'),
    paused = true,
    discs = [
        {
            x:150,
            y:250,
            lastX:150,
            lastY:250,
            velorityX:-3.2,
            velorityY:3.5,
            radius:50,
            innerColor:'rgba(255,100,0,1)',
            middleColor:'rgba(255,100,100,0.7)',
            outerColor:'rgba(255,255,255,0.5)',
            strokeStyle:'green'
        },
        {
            x:150,
            y:75,
            lastX:150,
            lastY:75,
            velorityX:1.2,
            velorityY:1.5,
            radius:25,
            innerColor:'rgba(255,0,0,1)',
            middleColor:'rgba(255,0,255,0.7)',
            outerColor:'rgba(255,255,0,0.5)',
            strokeStyle:'orange'
        },
    ],
    numDiscs = discs.length,
    animationButton = document.getElementById('animationButton');

function drawBackground(){

}
function update(){
    var disc = null;

    for (var i =0; i < numDiscs; i++) {
        disc = discs[i];
        if (disc.x + disc.velorityX + disc.radius >
            canvas.width ||
            disc.x + disc.velorityX - disc.radius < 0)
            disc.velorityX = -disc.velorityX;
        if (disc.y + disc.velorityY + disc.radius >
            canvas.height ||
            disc.y + disc.velorityY - disc.radius < 0)
            disc.velorityY = -disc.velorityY;
        disc.x += disc.velorityX;
        disc.y += disc.velorityY;
    }
}

function draw(){
    var disc = discs[i];
    for (var i = 0; i < numDiscs; i++) {
        disc = discs[i];
        gradient = ctx.createRadialGradient(disc.x,disc.y,0,
                                            disc.x,disc.y,disc.radius);//放射渐变
        gradient.addColorStop(0.3,disc.innerColor);
        gradient.addColorStop(0.5,disc.middleColor);
        gradient.addColorStop(1.0,disc.outerColor);

        ctx.save();
        ctx.beginPath();
        ctx.arc(disc.x,disc.y,disc.radius,0,Math.PI*2,false);
        ctx.fillStyle = gradient;
        ctx.strokeStyle = disc.strokeStyle;
        ctx.fill();
        ctx.stroke();
        ctx.restore();
    }
}

//calculate frame rate
var lastTime = 0;
function calculateFps(){
    var now = (+new Date),
        fps = 1000/(now - lastTime);
    lastTime = now;
    return fps;
}

//以不同的帧速率来执行不同的任务
var lastFpsUpdateTime = 0,
    lastFpsUpdate = 0;

//Animation
function animate(time){
    var fps = 0;
    if (time == undefined) {
        time = +new Date;//+new Date()是一个东西;  +相当于.valueOf();
    };
    if (!paused) {
        ctx.clearRect(0,0,canvas.width,canvas.height);
        //drawBackground();
        update();
        draw();
        var now = + new Date();
        //console.log(now);
        fps = calculateFps();
        if (now - lastFpsUpdateTime > 1000) {
            lastFpsUpdateTime = now;
            lastFpsUpdate = fps;
        };
        ctx.fillStyle = 'cornflowerblue';
        ctx.fillText(lastFpsUpdate.toFixed() + ' fps',20,60);
        window.requestAnimationFrame(animate);
    }
}

//event handlers
animationButton.onclick = function(e){
    paused = paused ? false : true;
    if (paused) {
        animationButton.value = 'Animate';
    }else{
        window.requestAnimationFrame(animate);
        animationButton.value = 'Pause';
    }
}

//Initialization
ctx.font = '48px Helvetica';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值