优化之后小球只会出来几个是什么原因有时候也不会出来

来源:5-1 性能优化

Swatermelon

2018-06-19 21:46


var WINDOW_WIDTH=1024;
var WINDOW_HEIGHT=768;
var R=8;
TOP=60;
LEFT=30;

const endTime=new Date(2018 ,5,20,18,47,52);
var curShowTimeSeconds=0;

var balls=[];
const colors=["#33B5E5","#0099CC","#AA66CC","#9933CC","#99CC00","#669900","#FFBB33","#FF8800","#FF4444","CC0000"];


window.onload=function () {
    var convas=document.getElementById("canvas");
    var context=canvas.getContext("2d");

    canvas.width=WINDOW_WIDTH;
    canvas.height=WINDOW_HEIGHT;

    curShowTimeSeconds= getCurShowTimeSeconds();
     setInterval(
         function () {
             render(context);
             update();

         },50
     )
}



function getCurShowTimeSeconds() {
    var curTime=new Date();
    var ret=endTime.getTime()-curTime.getTime();    //取得毫秒数
    ret=Math.round(ret/1000);  //转化为秒同时转化为整数

    return ret >=0?ret:0;

}

function update() {//时间的变化
    var nextShowTimeSeconds=getCurShowTimeSeconds();
    var nexthours=parseInt(nextShowTimeSeconds/3600);
    var nextminutes=parseInt((nextShowTimeSeconds-nexthours*3600)/60);
    var nextseconds=nextShowTimeSeconds%60;

    var curhours=parseInt(curShowTimeSeconds/3600);
    var curminutes=parseInt((curShowTimeSeconds-curhours*3600)/60);
    var curseconds=curShowTimeSeconds%60;

    if (curseconds != nextseconds) {
        if(parseInt(curhours/10)!=parseInt(nexthours/10)){
            addBalls(LEFT,TOP,parseInt(curhours/10));
        }
        if(parseInt(curhours%10)!=parseInt(nexthours%10)){
            addBalls(LEFT+15*(R+1),TOP,parseInt(curhours%10));
        }

        if(parseInt(curminutes/10)!=parseInt(nextminutes/10)){
            addBalls(LEFT+39*(R+1),TOP,parseInt(curminutes/10));
        }
        if(parseInt(curminutes%10)!=parseInt(nextminutes%10)){
            addBalls(LEFT+54*(R+1),TOP,parseInt(curminutes%10));
        }
        if(parseInt(curseconds/10)!=parseInt(nextseconds/10)){
            addBalls(LEFT+78*(R+1),TOP,parseInt(curseconds/10));
        }
        if(parseInt(curseconds%10)!=parseInt(nextseconds%10)){
            addBalls(LEFT+93*(R+1),TOP,parseInt(curseconds%10));
        }


        curShowTimeSeconds = nextShowTimeSeconds;
}

  updateBalls()
console.log(balls.length)
}

function updateBalls(){
    for(var i=0;i<balls.length;i++){
        balls[i].x+=balls[i].vx;
        balls[i].y+=balls[i].vy;
        balls[i].vy+=balls[i].g;

        if(balls[i].y>=WINDOW_HEIGHT-R){
            balls[i].y=WINDOW_HEIGHT-R;
            balls[i].vy=-balls[i].vy*0.75;
    }
    }

    // 优化性能解决占内存问题
    var cnt=0;
    for(var i=0;i<balls.length;i++)
     if(balls[i].x+R>0&&balls[i].x-R<WINDOW_HEIGHT)
        balls[cnt++]=balls[i];

    while(balls.length>cnt){
      balls.pop();
     }
}


function addBalls(x,y,num) {
    for(var i=0;i<digit[num].length;i++)
        for(var j = 0; j < digit[num][i].length; j++)
            if(digit[num][i][j]==1){
                var aBall={
                    x:x+j*2*(R+1)+(R+1),
                    y:y+i*2*(R+1)+(R+1),
                    g:1.5+Math.random(),
                    vx:Math.pow(-1,Math.ceil(Math.random()*1000))*4,//pow 平方
                    vy:-5,
                    color:colors[Math.floor(Math.random()*colors.length)]
                }
                balls.push(aBall)
            }



}

function render(cxt) {

    cxt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT)

    var hours=parseInt(curShowTimeSeconds/3600);
    var minutes=parseInt((curShowTimeSeconds-hours*3600)/60);
    var seconds=curShowTimeSeconds%60;

    rederDigit(LEFT,TOP,parseInt(hours/10),cxt);
    rederDigit(LEFT+15*(R+1),TOP,parseInt(hours%10),cxt);
    rederDigit(LEFT+30*(R+1),TOP,10,cxt);
    rederDigit(LEFT+39*(R+1),TOP,parseInt(minutes/10),cxt);
    rederDigit(LEFT+54*(R+1),TOP,parseInt(minutes%10),cxt);
    rederDigit(LEFT+69*(R+1),TOP,10,cxt);
    rederDigit(LEFT+78*(R+1),TOP,parseInt(seconds/10),cxt);
    rederDigit(LEFT+93*(R+1),TOP,parseInt(seconds%10),cxt);

    for(var i=0;i<balls.length;i++){
        cxt.fillStyle=balls[i].color;

        cxt.beginPath();
        cxt.arc(balls[i].x,balls[i].y,R,0,2*Math.PI,true);
        cxt.closePath();

        cxt.fill();
    }


}
function rederDigit(x,y,num,cxt) {
     cxt.fillStyle="rgb(0,102,153)";

     for(var i=0;i<digit[num].length;i++)
         for(var j = 0; j < digit[num][i].length; j++)
             if(digit[num][i][j]==1){
                 cxt.beginPath();
                 cxt.arc(x + (R + 1) * 2 * j + (R + 1), y + (R + 1) * 2 * i + (R + 1), R, 0, 2 * Math.PI);
                 cxt.closePath();

                 cxt.fill();

             }


}

不知道为啥~~~代码跟老师的一样呀~~~

写回答 关注

1回答

  • 沐oo音
    2018-07-23 17:12:58
    // 优化性能解决占内存问题
        var cnt=0;
        for(var i=0;i<balls.length;i++)
         if(balls[i].x+R>0&&balls[i].x-R<WINDOW_HEIGHT)
            balls[cnt++]=balls[i];
    
        while(balls.length>cnt){
          balls.pop();
         }

    优化的这里,你写的是:

    if(balls[i].x+R>0&&balls[i].x-R<WINDOW_HEIGHT)

    应该是小于屏幕的宽度吧:

    if(balls[i].x+R>0&&balls[i].x-R<WINDOW_WIDTH)

    你应该是把宽度写成高度了

炫丽的倒计时效果Canvas绘图与动画基础

学习HTML5中最激动人心的技术Canvas,彻底释放自己的创造力

96800 学习 · 1000 问题

查看课程

相似问题