Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Тормозит рисовалка на canvas (https://javascript.ru/forum/misc/52452-tormozit-risovalka-na-canvas.html)

fireballpro100 20.12.2014 07:02

Тормозит рисовалка на canvas
 
Прошу помощи! Ситуация следующая: есть довольно простенькая игрушка раскраска изображения, реализованная на canvas. Она работает, но с течением времени, тормоза становятся всё жёстче.

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

Я не очень силён в работе с канвасом. Есть ли способ как-то снизить нагрузку на canvas? Может как-то можно скажем избавляться от нижних слоёв?

Я надеюсь, здесь можно выложить ссылку на пример. Показываю с бесплатного хостинга - access denied

Заранее, благодарю всех оказавших желание помочь.

MallSerg 20.12.2014 09:54

Вложений: 1
На странице слишком много обработчиков событий 50 000 это очень много и чем дольше работает скрипт тем больше обработчиков добовляется

скорее всего проблема тут в
canvas.addEventListener("click", function(event) .....

Срочно читать документацию по «.addEventListener»

fireballpro100 22.12.2014 13:06

Спасибо большое, за помощь! Я заметил, что многие ненужные вещи у меня загноны в цикл отрисовки и отрабатывают лишнее разы. Таймер, установленный на сайте отрабатывал 10 раз в секунду, его я замедлил до секунды. Есть вещи которые работают на Jquery, а можно было их сделать на CSS - полагаю, что это тоже немного снизит нагрузку на события. Займусь этим в ближайшее время.

Но само собой, самое узкое место, это вызов функции отрисовки при перемещении мыши. Т.е. оно может вызываться вплодь до 2-3 тыс. раз в секунду и с этим уж, видимо, ничего не поделать, только изменить принцип отрисовки, избавившись от событий на перемещение мыши.

MallSerg 22.12.2014 13:22

Похоже ты не понял главного
canvas.addEventListener("click", function(event) ...
каждый раз когда вызывается функция addEventListener она добавляет еще один обработчики на это событие
старые уже добавленные обработчики так же остаются и выполняются
т.е. получается ситуация когда на одно движение мышки выполняются
50 000 обработчиков движения мышки вместо одного обработчика.

fireballpro100 22.12.2014 14:52

Т.е. нужно использовать removeEventListener после отработки события?

canvas.addEventListener('click', function(e){
...
canvas.removeEventListener('click', listener, false);
}, false);

fireballpro100 22.12.2014 15:50

Хотя, нет. Фаер баг пишет, мол нет такого события. Мда похоже не по тем урокам я учился.

Вообще, тормоза больше не ощущаются совсем. Я просто переделал еще функцию отрисовки. У кого то на этом форуме был хороший пример, я взял его за основу (там в событии только координаты мыши были и true/false для функции отрисовки). Так что, мне вообщем, не совсем понятно, проблема осталась или нет.


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