Как оптимизировать этот js (теперь загрузка ЦП превышает 40% при открытии страницы)

У меня есть этот кусок JavaScript на моей странице, и он значительно загружает процессор. Есть ли способ оптимизировать код? (Я использую jQuery, поэтому решения jQuery будут в порядке)

function Particle() {

            this.particleContainerWidth = $('#particle-container').width() - 100;
            this.particleContainerHeight = $('#particle-container').height() - 100;

            this.path = 'img/';
            this.images = ['particle1.png', 'particle2.png', 'particle3.png', 'particle4.png'];

        //  Randomly Pick a Particle Model
            this.image = this.images[randomInt(this.images.length)];
            this.file = this.path + this.image;

        //  Create a Particle DOM
            this.element = document.createElement('img');

            this.speed().newPoint().display().newPoint().fly();
        };

        //  Generate Random Speed
        Particle.prototype.speed = function() {
            this.duration = (randomInt(10) + 5) * 1100;
            return this;
        };

        //  Generate a Random Position                               
        Particle.prototype.newPoint = function() {
            this.pointX = randomInt(this.particleContainerWidth);
            this.pointY = randomInt(this.particleContainerHeight);

            return this;
        };

        //  Display the Particle
        Particle.prototype.display = function() {
            $(this.element)
                .attr('src', this.file)
                .css('position', 'absolute')
                .css('top', this.pointY)
                .css('left', this.pointX);
            $('#particle-container').append(this.element);

            return this;
        };

        //  Animate Particle Movements
        Particle.prototype.fly = function() {
            var self = this;
            $(this.element).animate({
                "top": this.pointY,
                "left": this.pointX
            }, this.duration, 'linear', function(){
                self.speed().newPoint().fly();
            });
        };

        function randomInt(max) {
        //  Generate a random integer (0 <= randomInt < max)
            return Math.floor(Math.random() * max);
        }

       $(function(){

            $('body').append('<div id="particle-container"></div>');

            var total = 8;
            var particles = [];

            for (i = 0; i < total; i++){
                particles[i] = new Particle();
            }
        }); 

3 ответа

Вы думали о реализации этого с <canvas> версия? Конечно, он не будет работать в IE напрямую, и я не уверен, будет ли он быстрее или медленнее. Вы также можете попробовать это с Processing.

Это потребует много изменений и переписывания, но вы можете создать новую функцию замедления для jquery и опубликовать ее для анимации. Тогда каждая ваша частица будет однажды выпущена с помощью animate() с вашей функцией замедления, и эта функция должна быть основана на:

  • случайный
  • текущее время (новая дата ()) по модулю некоторого числа
  • синглтон, содержащий отдельные направления

идеи:

Предполагая, что вы не хотите менять свой код, вы можете попытаться настроить частицы на полет с некоторым случайным таймаутом при первом запуске fly(). Это может изменить способ, которым это все выполнено. Не знаю, если это помогает или делает это медленнее, хотя;)

Второе - это качество. JQuery Animate делает это слишком гладко. Вы можете перемещать свои частицы вместо анимации и просто изменять расстояние для уменьшения и увеличения скорости и использовать setTimeout, чтобы заставить его двигаться в том же темпе, что и сейчас.

Вы не можете заставить JavaScript использовать меньше вашего процессора. Это определяется приоритетом исполняемого приложения в ядре ОС. Лучшее, на что вы можете надеяться - это сократить время выполнения.

Чтобы повысить эффективность выполнения, ограничьте использование прототипа и прекратите присваивать значения свойствам. Этот метод кодирования стал популярным, потому что он чрезвычайно чистый и легко читаемый, но его выполнение ужасно задом наперед.

Если вы способны кодировать, используя только переменные для присваивания, операторы для решений и циклы для циклов, выполнение вашего кода будет намного быстрее. Однако для этого потребуется написать больше кода, и это не будет так красиво.

Чтобы повысить производительность вывода, запишите все выходные сегменты в индекс массива и используйте только один метод соединения, когда все выходные данные созданы, и один метод innerHTML для вывода этого текста на страницу. Это уменьшит выполнение вывода до 4 раз.

Другие вопросы по тегам