这个网站如何获得如此优异的表现?我怎么能得到它?

时间:2015-05-28 16:33:10

标签: javascript jquery html5 canvas

我试图复制这个" blackhole"在i-remember.fr上看到的Javascript效果,但我没有比他们更好的表现,我做错了什么?我以前在我的代码中有一个运行每个动画帧的jQuery选择器,但是我现在已经删除了它,这有助于一堆。但是当他们的FPS低得离谱时,我仍然以40 FPS的速度运行!

查看他们的时间表 enter image description here

这是我的 enter image description here

由于帧率,我永远无法在实际操作中使用我的!关于他们用什么类型的巫术提高帧率的任何想法?

我的当前引擎

View it on CodePen

的Javascript

/*$('.blackhole').click(function() {
    $(this).toggleClass('open_blackhole');
    $(this).toggleClass('close_blackhole');
});*/


// Define Apparatus Variables.
var cw = window.innerWidth,
    ch = window.innerHeight,
    blackhole_entities = {},
    blackhole_entitiesIndex = 0,
    blackhole_entitieAmount = 12000, //6000
    blackhole_button = $('.blackhole'),
    canvas = $('<canvas/>').attr({
        width: cw,
        height: ch,
        id: "apparatus"
    }).appendTo('body'),
    context = canvas.get(0).getContext("2d");

var requestframe = window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    // IE Fallback, you can even fallback to onscroll
    function(callback) {
        window.setTimeout(callback, 1000 / 60)
    };

// Default Entity "Class"
apparatus.blackhole = function(orbit) {
    blackhole_entitiesIndex++;
    this.id = blackhole_entitiesIndex;
    blackhole_entities[blackhole_entitiesIndex] = this;

    this.width = .5;
    this.height = .5;
    this.orbit = orbit;

    this.velocity = Math.floor((Math.random() * 3200) + 2500);

    this.angle = (Math.PI * 2 / this.width) * Math.floor((Math.random() * cw*4) + 10);;
    var choice = Math.random() * 5;

    var rands = [];
    rands.push(Math.random() * 100 + 1);
    rands.push(Math.random() * 10 + 241);

    var choice2 = Math.random() * 4;

    var rands2 = [];
    rands2.push(Math.random() * 100 + 1);
    rands2.push(Math.random() * 180 + 211);

    this.distance = (rands.reduce(function(p, c) {
        return p + c;
    }, 0) / rands.length);

    this.distance2 = (rands2.reduce(function(p, c) {
        return p + c;
    }, 0) / rands2.length);
    this.increase = Math.PI * 2 / this.width;

    this.distancefix = this.distance;
    this.distance2fix = this.distance2;

    this.color = "255,255,255";
    this.alpha = 0.6

    this.bx = Math.random() * 20 + 1;
    this.by = Math.random() * 20 + 1;
    this.inplace = true;
}

apparatus.blackhole.prototype.draw = function() {
    if (this.orbit >= 2) {
        this.x = this.bx + this.distance * Math.cos(this.angle / this.velocity) + cw / 2;
        this.y = this.by + this.distance * Math.sin(this.angle / this.velocity) + ch / 2;
        this.alpha = 0.6;
    } else {
        this.x = this.bx + this.distance2 * Math.cos(this.angle / this.velocity) + cw / 2;
        this.y = this.by + this.distance2 * Math.sin(this.angle / this.velocity) + ch / 2;
        this.alpha = 0.4;
    }/*
    if (blackhole_button.hasClass('open_blackhole')) {
      blackhole_button.removeClass('close_blackhole');

        if (this.distance >= 171) {
            this.distance = this.distance - 4;
        } else if (this.distance <= 161) {
            this.distance= this.distance + 8;
        }

        if (this.distance2 >= 201) {
            this.distance2 = this.distance2 - 6;
        } else if (this.distance2 <= 161) {
            this.distance2 = this.distance2 + 6;
        }
    }
    if(blackhole_button.hasClass('close_blackhole')){
        if (this.distance >= this.distancefix + 4) {
            this.distance = this.distance - 4;
        } else if (this.distance <= this.distancefix - 5) {
            this.distance= this.distance + 5;
        }

        if (this.distance2 >= this.distance2fix + 10) {
            this.distance2 = this.distance2 - 4;
        } else if (this.distance2 <= this.distance2fix - 10) {
            this.distance2 = this.distance2 + 4;
        }

    }*/

    this.angle += this.increase;

    context.fillStyle = "rgba(" + this.color + "," + this.alpha + ")";
    context.fillRect(this.x, this.y, this.width, this.height);
}

apparatus.start = function() {
    apparatus('true');
}

apparatus.stop = function() {
    apparatus('false');
}

for (var i = 0; i < blackhole_entitieAmount; i++) {
    new apparatus.blackhole((Math.random() * 5));
}

var mode;
apparatus.spawn_blackhole = function(){
  for (i in blackhole_entities) {
    blackhole_entities[i].draw();
  }
}
function apparatus(mode) {
    if (mode == 'true') {
        var i;
        requestframe(function() {
            context.clearRect(0, 0, cw, ch);

            apparatus.spawn_blackhole(); 

            apparatus('true');
        });
    }
}

apparatus.start();

希望有人能够知道如何做到这一点。我只是想在Javascript画布操作中进一步了解。

非常感谢您提出的任何建议!

这个问题可能会被标记为与我的上一个问题重复,但我的上一个问题并没有给我一个真实的,可用的帧率。并且由于这个人做了回答&#34;我的问题,我现在在这里。

0 个答案:

没有答案