23.03.2015, 23:27
|
Новичок на форуме
|
|
Регистрация: 26.12.2011
Сообщений: 9
|
|
Тормозит неактивный кусок кода.
Помогите...
Тормозит кусок кода, который вроде как не участвует в работе...
Ссылка: Карта неба. Черновик.
При попытке перетащить карту мышкой, заметно сильное торможение прорисовки.
Вот кусок сбойного кода:
function Draw_map(server) {
if (Pervy_prohod==0)
{
alert("чтение из формы");
RazmerKartyX=document.NASTROYKI.RazmerKartyX.value;
RazmerKartyY=document.NASTROYKI.RazmerKartyY.value;
//RazmerKartyX=650;
//RazmerKartyY=650;
Pervy_prohod=1;
}
...
Функция Draw_map вызывается каждый раз при изменении координат мыши и перерисовывает карту.
Тормоза вызывают те две строки, которые читают данные из формы.
Если их закомментировать и вместо них активировать следующие две строчки (где "=650"), то торможение исчезает, - вот тут.
Да, считывание из формы сильно тормозит обработку, если постоянно вызывается...
Но, для этого я и поставил alert, чтобы было видно, что этот кусок отрабатывает только один раз, при загрузке страницы, а потом он уже не работает!
В чём может быть дело?
|
|
23.03.2015, 23:45
|
|
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
Может я что-то не то делаю, но в хроме вкладка Profiles показывает что тормозит вот эта функция canv.onmousemove
Так что возможно вы не туда смотрите
В общем то название функции намекает что она вызывается при перемещении мыши. И добавление в код console.log(event) показало что функция действительно вызывается при перемещении курсора мыши. А функция то какая-то навороченная.
|
|
24.03.2015, 08:04
|
Новичок на форуме
|
|
Регистрация: 26.12.2011
Сообщений: 9
|
|
Ну всё правильно, canv.onmousemove вызывает внутри себя функцию Draw_map при нажатой клавише мыши. Собственно я про это писал - "Draw_map вызывается при каждом изменении координат мыши"... Вероятно поэтому на "верхнем" уровне видно, что тормозит вроде как canv.onmousemove.
Но, реальные тормоза именно в Draw_map, прочитайте пожалуйста ещё раз первое сообщение (без претензий, я сам понимаю, что написано мутновато... но как смог...).
Попробую другими словами объяснить:
Draw_map также вызывается в начале отображении страницы, независимо от мышки. В самом её начале проверяется значение Pervy_prohod и если ==0 , то считываются данные из формы, чтобы определить размер карты. После чего Pervy_prohod=1.
Всё, дальше мы в этот кусок кода больше не проваливаемся при последующих вызовах Draw_map от перемещений мыши (об этом говорит то, что сообщение alert показывается только в самом начале).
Но, тормоза исчезают, если мы в этом куске кода жёстко зададим размеры карты, вместо их считывания из формы - это показано во второй ссылке первого сообщения.
Каким-то образом, этот кусок влияет на скорость отработки, несмотря на то, что все последующие разы он ОБХОДИТСЯ благодаря условию
if (Pervy_prohod==0)
Ну вот, не знаю как ещё объяснить...
Коллеги на работе просто глаза вытаращили, потому что это полный бред с точки зрения алгоритмики и больше похоже на глюк интерпретатора ДжаваСкрипта - как будто он запоминает, что эти значения надо читать каждый раз из формы, несмотря ни на что... Всё-же надеюсь, что напортачил именно я, вот только где?
Последний раз редактировалось kuksha, 24.03.2015 в 08:30.
|
|
24.03.2015, 16:04
|
Профессор
|
|
Регистрация: 28.05.2008
Сообщений: 182
|
|
сделай alert (RazmerKartyX + ' ' + typeof (RazmerKartyX)) - может данные имеют неудобоваримый формат? Ты в первой итерации присваиваешь в переменные значения и далее они у тебя до конца дней своих живут или меняют значение (например, при ресайзе окна)?
Кстати, тормоза во всех браузерах?
Я тоже много раз едва не утешал себя мыслью, что глюк хрен знает кого, но только не меня... но в итоге в абсолютном большинстве случаев это был именно мой баг или недосмотр
|
|
24.03.2015, 21:52
|
Новичок на форуме
|
|
Регистрация: 26.12.2011
Сообщений: 9
|
|
demoniqus, cпасибо огромное!!!
Принудительное приведение типа данных помогло:
RazmerKartyX=parseInt(document.NASTROYKI.RazmerKartyX.value);
RazmerKartyY=parseInt(document.NASTROYKI.RazmerKartyY.value);
проверю ещё раз в остальных местах - наверняка ещё в куче мест приведение забыл сделать...
Теперь можно и пользователям эту версию дать, хотя сам вопрос остался конечно - каким боком нерабочий кусок кода даёт такую наводку...
Значения RazmerKartyX/Y неизменны, пока страница не обновилась любым способом.
ЗЫ:
карта везде нормально работает, кроме фаерфокса, но это старая история, я на этого тормоза забил, хоть это и неправильный подход... А указанный глюк был одинаков по скорости в Опере и Хроме.
|
|
24.03.2015, 23:10
|
|
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
kuksha,
если переменные имеют "неудобоваримый формат" и при этом активно используются, то каждый раз происходит преобразование типа данных - наверное это и дает такой эффект. А как только формат стал цифровой, то и тормозить перестало. И не тормозило если вы вручную туда размеры забивали - ведь в этом случае формат тоже был числовой.
|
|
25.03.2015, 12:38
|
Профессор
|
|
Регистрация: 28.05.2008
Сообщений: 182
|
|
Я на своей практике не встречал, чтобы массовое преобразование типа данных тормозило, тем более настолько критично. Пока единственное, что я встретил, так это CSS-код, который намертво убивал IE11! Хотя не буду зарекаться...
А что в твоем случае означает "тормозит": просто крайне медленно работает или вообще зависает? Если ты имеешь в виду именно мертвое зависание, то это на 99,99999% полученные значения где-то порождают просто бесконечный цикл. Ведь проблема не в указанном куске кода, а именно в тех значениях, которые тут назначаются. Я бы на твоем месте взял "скальпель" и "препарировал" эти значения, пока не понял бы причину.
Фокс, кстати не такой уж тормоз. IE впереди планеты всей - по моим испытаниям вышло около 10X медленнее остальных браузеров независимо от версии (8 и 11) и платформы (ХР и Win7). Этот браузЁр полон "сюрпризов"...
И по идее фокс по "всеядности" ближе к Хрому, нежели к творению MS...
|
|
|
|