JS тормоза
На днях заболел очередной идеей, решил вспомнить ЯС и написать свой Арканоид (с блэкджеком и пр :) )
Но на стадии заготовки происходит неведомая фигня: в определенный момент (20-30 сек.) игра начинает резко тормозить.
http://yaweb.ru/test/2/index.html
Может кто сталкивался? В чем может быть проблема?
Браузер Опера (пользую как наиболее шустрый, но вроде и в остальных та же проблема)
Заранее спасибо!
var ball = document.getElementById("ball")
один раз в глобальной видимости (и юзать ниже её), чем каждый раз вызывать метод (тем более два раза).
Самое узкое место во всех браузерах - обновление изображения на экране, а у тебя это происходит каждые 0/15 мс - посчитай FPS, требуется много ресурсов.
Вывод профайлера в FF это подтверждает:
----------------------------------------
bmove 1000 90.16%
onmousemove() 92 4.04%
getElementComputedStyle 184 3.54%
mouseLayerXY 92 1.22%
checkPos 1000 1.05%
Как видишь - checkPos() вызывалось столько же раз, сколько и bmove(), но т.к. там одни вычисления, то выполняется она очень быстро - даже при том, что кода в ней больше, чем в bmove().
На медленных машинах у тебя накапливаются вызовы setInterval() (т.к. bmove() не ждёт, пока отработает предыдущая) и в какой-то момент всё виснет. По этой причине я обычно использую setTimeout() и замеряю время, прошедшее с последнего события таймера, а отсюда уже строю прочие вычисления. И движение получается плавнее.
он что-то очень медленно летает в любом случае
(с эстонским акцентом) этто пошаховая стратеххия
=)
Про Firebug не слышал? :) Первейшаая вещь для вебдева. Как откроешь консоль, сразу там кнопка будет.
Rofl :D
знаю, пользуюсь, вчера специально искал в нем измерялку - не нашел :(
знаю, пользуюсь, вчера специально искал в нем измерялку - не нашел :(
Ну ты даёшь :)
*посыпаю голову пеплом*
п.с.: Кстати совет по скорости помог
Хром в этом смысле намного лучше, ну, он под JS и заточен.
Поэтому я советую (1) использовать setTimeout вместо setInterval (и вызывать setTimeout после отработки функции таймера) и (2) строить расчёты не на задержке таймера, а на реально прошедшем времени, либо на оставшемся до завершении операции отрезке.
(2) поможет получить плавную анимацию даже на медленной машине/при тормозах браузера.
Рекомендовать к прочтению кроме гугла, увы, ничего не могу :)
Ещё прицепляю скрипт, который я использую для плавнго изменения характеристик любого (одного или нескольких) HTML-элемента. Он демонстрирует как раз оба пункта, которые я упомянул выше.
Названия функций там не очень удачные, начиналось всё со слайдера, а получилось немного большее.
SlideAs() просто обёртка для более удобного вызова Slide(). Использовать так:
SlideAs('height opacity', element, {maxDuration: 1000});
// свернуть, меняя длину, за 300 мс, с небольшим ускорением.
SlideAs('width', element, {maxDuration: 300, reverse: true, accel: true});
// сложный вариант, сразу оперирует над 2-мя разными жлементами.
Slide({element: el1, prop: 'opacity', maxDuration: 1000},
{element: el2, prop: 'height', maxDuration: 500},
{element: el2, prop: 'top', maxDuration: 500});
При вызовах можно задать больше опций, чем в примерах, см. SetupSlideOptions() - там они все устанавливаются.
Функции вроде $each(), $hide(), $style() говорят сами за себя и тривиальны, поэтому сюда не приложил.
Я тоже когда-то пытался арканойдить:
http://mrlinker.narod.ru/arc/
Где-то еще была версия с вылетающими призами и разнотипными квадратиками, но не могу найти :)
В основном цикле тригонометрия не нужна.
Достаточно один раз, когда меняется угол, расчитать единичный вектор.
У меня там массив field позволяет нарисовать уровень.
В общем мне не хватало этих количественных размышлений об интервалах обновления. Спасибо.
Семафоры в JS... об этом надо написать статью :D
jQuery умеет уйму всего и всё уже отточено, но я предпочитаю писать всё сам, так интереснее.
Рад что смог помочь :)
http://yaweb.ru/test/2/index.html
старт/пауза - клик по полю.
Если работой не завалят - буду делать дальше блоки (разных ствойств) и бонусы. Как и что делать представляю, всё дело в "сесть и сделать" :)
п.с.: вопросом "на кой я это делаю?" задаюсь постоянно, но ответа пока не нашел. Если у кого будут какие-то мысли - пишите, хоть в ЛС.
п.п.с.: есть еще мечта переписать Тетрис...
Кстати, есть и глюк - после game over'а кликаешь ещё раз, появляется картика "Паука", клик - снова игровое окно, alert(game over), клик - "Пауза" и т.д. бесконечно.
п.с.: вопросом "на кой я это делаю?" задаюсь постоянно, но ответа пока не нашел. Если у кого будут какие-то мысли - пишите, хоть в ЛС.
Для удовольствия и самообчения, зачем же ещё :)
Кстати, есть и глюк - после game over'а кликаешь ещё раз, появляется картика "Паука", клик - снова игровое окно, alert(game over), клик - "Пауза" и т.д. бесконечно.
это не бага, это фича ;)
Так и знал что кто-нибудь заметит. Кстати если подвести биту, то можно продолжать игру.
Естественно вместо алерта с гамовером будет обнуление счетчиков, позиций и пр. :)
Да, скорость реально исправилась во всех браузерах.
В общем буду делать и выкладывать сюда что получилось :)
призы (действующие), очки, жизни.
Раньше не мог достучаться до форума, лежал что ли?...
Раньше не мог достучаться до форума, лежал что ли?...
Было дело. Майк наверное на CC10 уезжал и забрал с собой сервер :D
Арканоид кстати тормозить стал, даже больше, чем в первой версии.
Добавить бы сюда спецэффекты, как в версии MrLinker'а с jQuery :rolleyes:
по поводу анимации надо подумать, но получатся пересекающиеся таймеры, что не есть правильно.
по поводу анимации надо подумать, но получатся пересекающиеся таймеры, что не есть правильно.
В этом и соль :) Можешь попробовать сделать, как делают в играх - обновлять экран каждые N мсек, используя данные о перемещении объектов, вместо обновления экрана по ходу этого перемещения.
Не уверен правда, насколько это будет быстро в JS.