Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   программная анимация (https://javascript.ru/forum/misc/23608-programmnaya-animaciya.html)

taha 05.12.2011 12:49

melky,
во всех броузеров работало отлично.. просто моя позиция если можно исправить что-то, то лучше это сделать...

ещё раз спасибо всем.. анимация стала работать в разы быстрее даже на, вечно жрущем память, firefox'е

жалко только что IE<9
transition: transform 0.4s linear;
box-shadow: 0px 2px 2px rgba(0,0,0,0.7);
border-radius: 5px;

понимать отказывается, а при подключении PIE.htc вообще как-то странно себя ведёт, но срать на его пользователей.. основная часть анимации меню на js, им этого будет достаточно

nerv_ 05.12.2011 13:09

Цитата:

Сообщение от trikadin (Сообщение 140747)
nerv_, ваш способ медленнее и больше памяти жрёт.

не сочтите за труд, скажите почему? Дело в обращении к объекту или setTimeout?

devote 05.12.2011 13:24

Цитата:

Сообщение от nerv_ (Сообщение 140866)
не сочтите за труд, скажите почему? Дело в обращении к объекту или setTimeout?

Да мне тоже хотелось бы выслушать позицию на эту тему...

taha 05.12.2011 13:55

здесь в теме всё описано, все мои предположения, сомнения, и опровержения со стороны знающих людей

читайте сначала этой темы

про скоп замыкания и тд.

Цитата:

Советы по оптимизации

Большое количество таймеров сильно нагружают процессор.
Если вы хотите запустить несколько анимаций одновременно, например, показать много падающих снежинок, то управляйте ими с помощью одного таймера.

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

Фреймворки обычно используют один setInterval и запускают все кадры в заданном интервале.
Помогайте браузеру в отрисовке
Браузер управляет отрисовкой дерева и элементы зависят друг от друга.

Если анимируемый элемент лежит глубоко в DOM, то другие элементы зависят от его размеров и позиции. Даже если анимация не касается их, браузер все равно делает лишние расчёты.

Для того, чтобы анимация меньше расходовала ресурсы процессора(и была плавнее), не анимируйте элемент, находящийся глубоко в DOM.

Вместо этого:

Для начала, удалите анимируемый элемент из DOM и прикрепите его непосредственно к BODY. Вам, возможно придется использовать position: absolute и выставить координаты.
Анимируйте элемент.
Верните его обратно в DOM.

Эта хитрость поможет выполнять сложные анимации и при этом экономить ресурсы процессора.

Если JavaScript-анимация слишком медленно работает на смартфонах и планшетах, то, возможно, стоит заменить ее CSS-переходами.

taha 05.12.2011 14:09


анимация и процессор))

trikadin 05.12.2011 16:08

Цитата:

Сообщение от taha
не сочтите за труд, скажите почему? Дело в обращении к объекту или setTimeout?

Потому что setInterval - это нативное повторение через определённый промежуток. Оно по умолчанию быстрее всего, что вы можете сделать в исполняемом коде JS. А в вашем варианте такты процессора расходуются ещё и на постоянное добавление setTimeout. Я, наверное, плохо объясняю, но суть в этом.

Вторая причина - так как setTimeout вложенный, то для поиска локальных переменных интерпретатору придётся каждый раз подниматься всё на большее кол-во скопов.

Kolyaj 05.12.2011 16:13

Цитата:

Сообщение от trikadin
Вторая причина - так как setTimeout вложенный, то для поиска локальных переменных интерпретатору придётся каждый раз подниматься всё на большее кол-во скопов.

Какая глупость.

В целом про setTimeout vs setInterval http://alljs.ru/articles/timeout/setinterval

devote 05.12.2011 16:38

Что меня поражает, то что люди где-то что-то вычитают, и потом всем подряд советую при этом выкрикивая что, что-то там не рекомендуется. Насчет скопов я не соглашусь, наиполнейший бред, никаких скопов там не собирается. Проверено не однократно, загрузка ЦП да чуть выше у setTimeout по известной причине. Так как setTimeout более корректнее работает с задержками, пожирание памяти никакой нет... Если считаете иначе, пример в студию...

От себя добавлю, анимацию через setTimeout делаю и не имею проблем, протестировано временем и жестокими тестирования. Запустите:
setTimeout(function blah(){
    setTimeout(blah, 1);
}, 1);
при таком примере, браузер бы умер от загрузки и пожирал бы память как голодный волк. Но этого не происходит.

Хватит людям впаривать в мозг всякий бред о ресурсах и т.д. ИМХО

taha 05.12.2011 16:41

хмммммм... и все источники противоречат друг другу...

и всётаки хотелось бы больее детальных поянений.. совершенно естествеенно, что мини-турбини функции с одим действием работают примерно одинаково, но если будет больше локальных переменных во внешней функции и их будет много в локальной, ну или они хотябы будут(в примерах статьи их нет)??? что будет??

допустим у меня с итервалом работает быстрее чем с таймаутом..

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

taha 05.12.2011 16:46

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


скачек нагрузки проца при каждой анимации в firefox я наблюдаю на системном мониторе.. см картинку выше

trikadin 05.12.2011 19:40

Kolyaj, devote, век живи - век учись) Но тогда я тоже хочу уточнить, почему не происходит накопления скопов. Казалось бы, такое поведение было бы достаточно логичным...

devote, я доверяю вашему опыту, но хотелось бы узнать чуть больше о теории - почему именно этого не происходит)

devote 05.12.2011 19:49

Цитата:

Сообщение от trikadin
почему именно этого не происходит)

Все очень логично, думать долго не нужно... при подобном использовани:
setTimeout(function blah(){
    // ...
    setTimeout(blah, 1);
}, 1);
Ты передаешь таймеру ссылку на функцию которая не находиться внутри текущего scope, интерпретатор это видит и не сохраняет scope предыдущей функции, если же интерпретатор видит такую конструкцию:
setTimeout(function blah(){
    // ...
    setTimeout(function(){
        blah();
    }, 1);
}, 1);
Он будет вынужден сохранить scope вызвавшей его функции, так как передана не ссылка а функция, которая находиться в области видимости предыдущей функции... И думать тут не нужно, интерпретатор не дураки писали, и понимали что нет смысла хранить scope в случаях что я указал в первом примере.

trikadin 05.12.2011 20:10

devote, а так?

setTimeout(function blah(){
var i=0;// например
setTimeout(blah, 1);
}, 1);

И кстати - у меня ваш пример из консоли не запустился в ff8.

devote 05.12.2011 20:21

Цитата:

Сообщение от trikadin
devote, а так?

Тоже scope удалится, нет смысла его хранить. Написал же, ссылка не может получить доступ к scope из которой ее вызвали.

Цитата:

Сообщение от trikadin
И кстати - у меня ваш пример из консоли не запустился в ff8.

Он будет работать в strict mode так как функцию с именем, в обычном режиме не поюзаешь. Надо примерно так:

function blah(){
    // ....
    setTimeout( blah, 1 );
}
setTimeout( blah, 1 );
scope сохраняется лишь в том случае, если внутри этой функции была создана другая функция, которой возможно нужно будет обратиться к scope своего потомка. Но только до того как ссылка на функцию не будет утерена.

trikadin 05.12.2011 20:26

Цитата:

Сообщение от devote
Он будет работать в strict mode так как функцию с именем, в обычном режиме не поюзаешь.

Как переводить в строгий режим? Имеется в виду доктайп?

devote 05.12.2011 20:30

приведу пример

function blah(){ 
    var a = 1;
    //  scope этой функции будет храниться до тех пор, пока 
    document.body.onclick = function(){  // эта функция имеет жизнь
        // как только эта функция потеряет связь с миром, все scope будут удалены
    }
}


например scope функции blah() будет храниться до тех пор, пока ее внутренний объект(функция) имеет связь с чем-то либо, тоесть в наше случае ссылка на нее висит у объекта BODY, если потеряю ссылку, тоесть выполню где-то:
document.body.onclick = null;
то scope верхней функции будет уничтожен сборщиком мусора.

melky 05.12.2011 20:30

Цитата:

Сообщение от trikadin (Сообщение 140926)
Как переводить в строгий режим? Имеется в виду доктайп?

MDN
"use strict";

// наш код..

devote 05.12.2011 20:31

Цитата:

Сообщение от trikadin
Как переводить в строгий режим? Имеется в виду доктайп?

function blah() {
    "use strict"; // - переключили в строгий режим
    // ...
}

trikadin 05.12.2011 20:55

Как много я всего не знаю ещё)

devote, я понимаю, как работает механизм замыканий) Непонятки были только с тем моментом...

nerv_ 07.12.2011 19:33

Большое всем спасибо :)


Часовой пояс GMT +3, время: 20:06.