Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Понтовая менюшка... Понтовая в кавычках... 
:(
    Опции темы
Dima 2015
Дата 24.9.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



krundetz, пожалуй... вынес в класс постоянные параметры, правда вот на работе оценить не могу стало ли лучше, тут комп мощный, и так все летает.
PM MAIL ICQ   Вверх
krundetz
Дата 24.9.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: нет
Всего: 69



Думаю разница будет заметна при большом количестве(несколькор сотен а может и тысячь) передвигаемых обектах 


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Dima 2015
Дата 24.9.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



krundetz, у меня объекта 4 всего. Зато вот делается это очень часто - ф-ции движения сами себя вызывают раз в 20-50 мсек (хотя это условно, на самом деле JS так быстро уже не работает)

И таких ф-ций 4 штуки - на каждый шар своя, поэтому наверно и тормозит все. И ф-ции содержат довольно сложные вычисления - корни там всякие... бррр
PM MAIL ICQ   Вверх
source777
Дата 24.9.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(Dima 2015 @  19.9.2008,  16:48 Найти цитируемый пост)
был бы рад услышать как сделать так чтобы эта конструкция меньше комп грузила.

Убери parseFloat вообще, отовсюду, необходимости в нём там нигде нет, а на него куча ресурсов уходит...
Подсказка, все изменяемые св-ва храни в shadow[i], а стили будут тогда меняться примерно так:
Код

               // ** Качание шрифта
        if (shadow[number].x < 0) {
            shadow[number].div.style.fontSize = (++shadow[number].fontSize) + 'px';
            shadow[number].div.style.top = (--shadow[number].top) + 'px';
        } else {
            shadow[number].div.style.fontSize = (--shadow[number].fontSize) + 'px';
            shadow[number].div.style.top = (++shadow[number].top) + 'px';
        }



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Dima 2015
Дата 24.9.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



source777, вообще логично. Т.е. нужно тащить с собой всю дорогу значения изменяемых свойств в свойствах объекта, а не снимать их каждый раз непосредственно с элемента. В некоторых местах у меня вроде так и сделано, но не везде. И при необходимости изменения меняем значение свойства объекта а св-во хтмл-элемента устанавливаем равному этому значению ну и + 'px', вроде верно понял твою мысль... сделаю.
PM MAIL ICQ   Вверх
source777
Дата 24.9.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Вот немного оптимизированный код, отпишись о результатах сравнительного тестирования... 
Код

// Число пунктов в меню
var size_of_menu = 6;

// Массив для объектов
var shadow = new Array(size_of_menu);

// Объект счетчик
var count;

var horizontal_amplitude = 14;
var half_ampl = horizontal_amplitude / 2;
/*
* Инициализация объекта и его свойств
*/
function init() {
    for (var i = 1; i <= size_of_menu; i++) {
        // Объект тени
        shadow[i] = new Object();
        
        // Флаг анимации
        shadow[i].animation_started = false;
        
        // div с тенью
        shadow[i].div = document.getElementById('link_' + i + '_shadow');
        
        shadow[i].fontSize = parseInt(shadow[i].div.style.fontSize);
        shadow[i].top = parseInt(shadow[i].div.style.top);
        shadow[i].left = parseInt(shadow[i].div.style.left);
        
        // Флаг двигаться вправо
        shadow[i].go_right    = false;

        // Число точек поворота
        shadow[i].turn_quantity = 0;
        
        count = document.getElementById('count');

    }    
}



// Скорость в пикселях по горизонтали и вертикали
var vertical_speed = 1;
var horizontal_speed = 1;

// Общая частота анимации
var frequency = 70;

// Максимальная скорость - сколько раз одновременно может быть щапущена анимация
var max_speed = 18;

// Счетчик вызова ф-ии анимации
var counter = 0;

/**
* Запуск анимации
*/
function animation_start(number) {
    
    if (shadow[number].animation_started != true && counter < max_speed) {
                
        animate(number);
        
        counter++;
        
        //shadow[number].animation_started = true;
        
    }
    
}

function rockFont(number)
{
    if ((shadow[number].left < 0) ^ shadow[number].go_right) {
        shadow[number].div.style.fontSize = (++shadow[number].fontSize) + 'px';
        shadow[number].div.style.top = (--shadow[number].top) + 'px';
    } else {
        shadow[number].div.style.fontSize = (--shadow[number].fontSize) + 'px';
        shadow[number].div.style.top = (++shadow[number].top) + 'px';
    }
}

/*
* Непосредственно анимация
*/
function animate(number) {

    horizontal_move(number, !shadow[number].go_right);
    // ** Качание шрифта
    rockFont(number);
    // ** Движение по вертикали
    vertical_move(number, (Math.abs(shadow[number].left) > half_ampl));

    if (Math.abs(shadow[number].left) > horizontal_amplitude) {
        shadow[number].go_right = !shadow[number].go_right;
        shadow[number].turn_quantity++;
    }

    count.innerHTML++;
    
    // ** Остановка
    if (shadow[number].turn_quantity > 1 && shadow[number].left == 0) {
        animation_stop(number);
    } else {
        shadow[number].t_animation = setTimeout('animate(' + number + ');', frequency);
    }
    
    
}

/*
* Остановка анимации - возвращает все на исходные позиции
*/
function animation_stop(number) {
    shadow[number].go_right = false;
    shadow[number].turn_quantity = 0;
    //clearTimeout(shadow[number].t_animation);
    
    shadow[number].fontSize = 24;
    shadow[number].top = 0;
    shadow[number].left = 0;
    
    shadow[number].animation_started = false;
    shadow[number].div.style.fontSize = shadow[number].fontSize + 'px';
    shadow[number].div.style.top = shadow[number].top + 'px';
    shadow[number].div.style.left = shadow[number].left + 'px';

    counter--;
    
}

function horizontal_move(number, to_left)
{
    if (to_left)
    {
        shadow[number].left -= horizontal_speed;
    } else {
        shadow[number].left += horizontal_speed;
    }
    shadow[number].div.style.left = shadow[number].left + 'px';
}

function vertical_move(number, on_top)
{
    if (on_top)
    {
        shadow[number].top -= vertical_speed;
    } else {
        shadow[number].top += vertical_speed;
    }
    shadow[number].div.style.top = shadow[number].top + 'px';
}



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Dima 2015
Дата 26.9.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



source777, поставил твой код.

На машине 1 ГГц и 496 ОЗУ не тянет. Лагает очень сильно. На моих 2х ГГц-ах  1 Гб ОЗУ летает, в прочем как и раньше. А среднего у меня нету для тестов...

Это сообщение отредактировал(а) Dima 2015 - 26.9.2008, 17:08
PM MAIL ICQ   Вверх
source777
Дата 26.9.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(Dima 2015 @  26.9.2008,  16:54 Найти цитируемый пост)
source777, поставил твой код.
Не, не, не. Это твой код, просто нормально записанный! А алгоритм я не трогал.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
source777
Дата 26.9.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Кстати что касается скорости работы, то тут уже больше от браузера зависит, а не от компьютера... Для начала можешь скорость увеличить:
Код

var vertical_speed = 3;
var horizontal_speed = 3;



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Dima 2015
Дата 27.9.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



source777, ну в твоем варианте parseFloat не используется при каждом акте движения, я это и имел в виду, но особо легче от этого не стало.

А касаемо скорости - трудно судить, просто на слабых машинах эта менюшка лагает в прямом смысле этого слова. Как знаешь, во времена 133-х пентиумов новые игры, которые еле еле запускались и по кадрам показывались, вот такая фигня...
PM MAIL ICQ   Вверх
source777
Дата 27.9.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(Dima 2015 @  27.9.2008,  16:13 Найти цитируемый пост)
просто на слабых машинах эта менюшка лагает в прямом смысле этого слова. 
Я такого слова не знаю, поясни. Слабые это кстати какие? Я тестил на 512 Мб ОЗУ, 1700 MGz и всё летает. Расскажи как именно ты производишь замеры производительности? это очень важно...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Dima 2015
Дата 27.9.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



source777, хех... если б я умел грамотно делать замеры производительности... Ну я умею посмотреть сколько памяти съедает Фаерфокс и какова загрузка ЦП в момент анимации (alt+ctrl+del - вкладочки процессы и быстродействие соответственно). Сейчас вот показывает порядка 50% в момент анимации теней и 64% если одновременно еще шары начать крутить.

Касаемо памяти мне кажется это необъективный критерий. Ибо очень сильно от браузера зависит, ФФ например всегда оперативки кушала за троих...

Теперь по поводу лагает. Представим себе элемент div, к которому применяется ф-ция движения. Эта функция двигает элемент на 1 px скажем влево и вызывает сама себя через 10 мсек. Таким способом я реализую плавное движение элементов:

Вроде должно работать если скопировать...
Код

<html>
<head>
<title>TeSt</title>
<script>
var div;
var left;
function init() {
     div    = document.getElementById('target');
    left    = parseInt(div.style.left);
    }

function move() {
    left+=1;
    div.style.left = left + 'px';
    setTimeout('move()', 10);
    }
</script>
</head>
<body>
<div onclick="move();" id="target" style="width: 20px; height: 20px; position: absolute; left: 50px; top: 50px; border: 1px solid blue"></div>
<script>
init();
</script>
</body>
</html>


Клик на div приводит к тому что он ПЛАВНО едет вправо, с постоянной скоростью, без остановок, как говорили в школе - равномерно и прямолинейно smile

Так вот "лагает" это когда равномерность движения теряется. Проедет немного, остановится. подумает, снова проедет еще немного, в целом движение происходит гораздо медленнее чем когда "не лагает".  Некая имитация, для того чтоб проиллюстрировать "лаги" может быть получена если ф-цию move в примере записать так:

Код

function move() {
    
    var rnd = Math.random(1);

    if (rnd > 0.7) {
        left+=1;
        div.style.left = left + 'px';
    }

    setTimeout('move()', 10);
    }


Собственно уже на этом примере видно как подпрыгивает загрузка ЦП при движении. А теперь представим что ф-ций таких не одна а 6 (грубо говоря на каждый пункт меню - своя), и каждая делает не просто сдвиг на 1 пиксел влево, а расчет координат, проверки и тд и тп...

Я так понимаю это и загружает ЦП.

Это сообщение отредактировал(а) Dima 2015 - 27.9.2008, 23:59
PM MAIL ICQ   Вверх
source777
Дата 28.9.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(Dima 2015 @  27.9.2008,  23:56 Найти цитируемый пост)
Эта функция двигает элемент на 1 px скажем влево и вызывает сама себя через 10 мсек.

А ты сделай через 50 мс. и на 5 px, зрительная плавность движения от этого ничуть не пострадает, а нагрузка на комп значительно уменьшится.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Dima 2015
Дата 28.9.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



source777, ну это то понятно. Это я для примера привел, реально у меня как раз шаг порядка 3-4 пикселей. Больше уже не получается, ставить более 6 пикселей - становится заметно равное движение.

Однако, как я понимаю, неверно что

Двигать на 1px и ставить setTimeout('move()', 10) эквивалентно тому, чтоб двигать на 5 px и ставить setTimeout('move()', 50).

Когда в ход идут такие маленькие интервалы времени то JS (или это косяк браузера) не точно работает. Точные интервалы он выдает гдето до 100 мсек, это уже обсуждалось ранее, к сожалению не смог найти ту тему. Ну досаточно запустить ф-цию, которая будет увеличивать переменную а (изначально равную 0) на 1 и вызывать сама себя через 10 мсек и посмотреть до скольки добежит а за 10 секунд. Теоретически то должна добежать до 1000, однако реально будет много меньше. Все это я к тому, что увеличивая шаг движения в 5 раз интервал вызова ф-ций придется подбирать вручную, чтоб визуальная скорость сохранилась.

-------
-------

Мне тут оригинальную идею предложили, относительно шаров. У меня сейчас они вращаются с использованием ур-я окружности. Т.е. меняем left на какое-то значение шага (3-4 пиксела) и пересчитываем top исходя из ур-я окружности. Но есть и другой вариант вращения объекта. Такая штука как матрица поворота из лин. алгебры. Можно ее попытаться использовать. Реально, как я понимаю это замена вычисления

var x = Math.floor(Math.sqrt(ball[3].radius * ball[3].radius - y*y));

на 4 операции умножения и 3 операции сложения, черть его знает что легче...

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

PM MAIL ICQ   Вверх
Dima 2015
Дата 13.12.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



deleted

Это сообщение отредактировал(а) Dima 2015 - 13.12.2008, 10:27
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




[ Время генерации скрипта: 0.1316 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.