Kineticjs останавливает рендеринг

Использование кинетического js для списка каталогов с возможностью поиска в киоске. Он отлично работает! кроме одной проблемы. Я нахожусь в хроме и имею список a, b, c, d и т. Д. На стороне, которую пользователь может щелкнуть, чтобы найти имена, начинающиеся с этой буквы. Когда на букву нажимают, она перерисовывает всю сцену. После 10-15 таких действий этап становится пустым, но я все еще могу щелкнуть, где должно быть имя, и получить его подробное «лайтбокс», или щелкнуть, где будет буква, и получить новый список, но все еще пустой этап. , то есть без заливки или цвета любых прямоугольников или текста. Что еще хуже, если я перехожу на совершенно другую страницу киоска, которая использует KineticJS для чего-то другого, она также не отображается и никогда не будет отображаться снова, если я не покину домен (localhost) и не перейду в Google или что-то еще и вернусь, или не открою новую вкладку или перезапустите Chrome. Сейчас я совершенно потерян, и переделывать это без Kinetic будет огромной потерей, если я не смогу понять это.

Я прошел и попытался убедиться, что с моим управлением памятью все в порядке, и почти уверен, что это так. Моя системная память действительно увеличивается, но Chrome, похоже, довольно быстро ее собирает. Я даже пытался вызвать destroy() для каждого объекта kineticjs, который я создаю при повторном рендеринге, но безуспешно.


person Dave_750    schedule 21.08.2013    source источник
comment
Нужно ли перерисовывать всю сцену? Можете ли вы просто повторно визуализировать слои или иметь каждый список как отдельный слой/группу и скрывать/показывать их по мере необходимости? Нам нужно увидеть некоторый код (и jsfiddle было бы неплохо), чтобы помочь в дальнейшем.   -  person projeqht    schedule 21.08.2013
comment
Мне, вероятно, НЕ НУЖНО перерисовывать всю сцену, но это было простое решение, и оно прекрасно работает. Мой скрипт состоит из 800+ строк со всеми необходимыми функциями (поиск, всплывающая клавиатура (также кинетическая сортировка) и т. д.). Я попытаюсь воссоздать в jsfiddle и опубликовать его как можно скорее.   -  person Dave_750    schedule 21.08.2013
comment
Так что НЕ перерисовывать сцену, казалось, позаботился об этом. Это было легко сделать, но теперь оно, кажется, занимает больше памяти. Я посмотрю документы, чтобы убедиться, что я правильно их использую. Спасибо за предложение.   -  person Dave_750    schedule 22.08.2013
comment
Мне все еще интересно, почему он блокирует его между совершенно разными страницами на одном сайте?   -  person Dave_750    schedule 22.08.2013
comment
Кстати, как вы перерисовываете сцену, stage.draw()?   -  person projeqht    schedule 22.08.2013
comment
Да, сейчас у меня есть то, что когда я вызываю свою функцию для повторного рендеринга, я делаю stage.destroyChildren(), добавляю новые слои, а затем stage.draw(). Все еще смотрю, что нужно сделать, чтобы повторно использовать сцену и восстановить память.   -  person Dave_750    schedule 22.08.2013
comment
Как я упоминал ранее, нужно ли уничтожать сцену каждый раз, когда вы хотите добавить новые слои? Я думаю, что было бы более эффективно добавить все ваши слои на сцену один раз, скрыть неактивные, а когда вам нужно переключиться, просто показать/скрыть слои соответствующим образом. Звучит дорого, чтобы продолжать уничтожать / читать все подряд. Еще один способ повысить производительность — сгруппировать объекты по группам, а не по слоям, если это имеет смысл. Каждый слой инициирует 2 холста, поэтому вы можете понять, почему это будет дороже.   -  person projeqht    schedule 22.08.2013
comment
Дополнительная информация: stackoverflow.com/questions/17632068/   -  person projeqht    schedule 22.08.2013
comment
Теперь я повторно использую объект 1 этапа с большим улучшением. Я также пробовал рисовать все 26 (буквы алфавита) слоев и показывать/скрывать их, но это тоже очень дорого. Пользователь также может использовать мобильный телефон, например клавиатуру, и искать имя, и совпадения будут отображаться на той же сцене. Я извлекаю данные для этого каталога из Active Directory (бэкэнд — это сервер Django и служба, которая публикует сообщения из AD каждую ночь), и мне нужно управлять почти 1000 записями. Я не заметил разницы в скорости отклика при таком использовании, но значительно большее время загрузки повлияло на удобство использования. Сейчас работает очень хорошо   -  person Dave_750    schedule 22.08.2013


Ответы (1)


В Chrome 29 существует известная проблема с отрисовкой холста. Проблема отсутствует в версиях 28 и 30. Присоединяйтесь к группе и помогите привлечь внимание к проблеме. :) https://code.google.com/p/chromium/issues/detail?id=280153&thanks=280153&ts=1377616231#makechanges

В качестве временного обходного пути вы можете отключить ускорение 2D-холста, установив флажок «Отключить ускоренный 2D-холст».

person jws    schedule 28.08.2013
comment
Чувак!! Я не могу сказать вам, как долго я боролся с этим. Это чуть не провалило весь мой проект. Отключение 2D-холста на 29, а также переход на 30 позаботились об этом. Ну что ж, мой javascript теперь, по крайней мере, абсолютно пуленепробиваемый!!! Спасибо большое!! - person Dave_750; 29.08.2013
comment
Рад, что смог помочь! Я тоже немного вытягивала волосы. - person jws; 29.08.2013
comment
спасибо, отлично работает! Теперь, как мне заставить всех моих конечных пользователей сделать это? - person logic8; 17.09.2013