Рабочая задача: карта + объекты
Ничего экстраординарного, просто задача по работе попалась.
Дана карта местности (картинка), на неё нанесено большое количество объектов, несколько тысяч. В каждый объект можно тыцнуть мышкой, карта большая, её надо позволять «таскать» мышкой.
Текущее решение тормозит, а надо сделать так, чтобы не тормозило.
У меня была гипотеза, что если нарисовать всё это дело на большущем CANVAS, выходящем за пределы экрана и позволить его таскать мышкой, то тормозит не будет.

При клике происходит поиск объекта по списку (безо всякой оптимизации пока), если объект найден, то выводит информацию по цвету, если зажать кнопку мыши, срабатывает флаг «пользователь желает тащить», если пошевелить в этот момент мышью, координаты CANVAS будут меняться вслед за мышью.
Вроде не тормозит, хороший способ делать карты. Делюсь, вдруг пригодится кому.
Комментарии 35
Ога :)
Комментарий для indeec17:
real to int, видимо (в JS не силён)
http://wdh.suncloud.ru/js04.htm#ref343
Комментарий для indeec17:
Правда, но карта ограниченной местности. Она вся тут поместится.
Выше правильно ответили, это действительно приведение к целому. Точнее, это побочный эффект оператора „~“.
Тестировалоь на: UA: Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
Спасибо! Это у меня проверочный прототип, скорее, чем реальный проект.
Не знаю, чья бага, оперы (11.5) или скрипта, но если отпустить кнопку мыши вне канваса
По поводу карт, разработчики World of Tanks сделали карту на SVG, http://challenge.worldoftanks.ru/uc/clanwars/maps/
SVG сильно тормозит, если отображается много объектов (у меня на карте их 4000, это смерть для SVG).
Это не сама технология плохая, просто она пока не «модная», поэтому разработчики браузеров не оптимизируют отображение SVG.
Комментарий для Евгения Степанищева:
Спасибо, буду знать. Замечательно сокращает код.Как-то даже не подумал, что операция not отбрасывает дробную часть. Как-то, когда экспериментировал с C--, там дробная часть имела битовое представление и нормально инвертировалась.
Комментарий для indeec17:
JS не умеет работать побитно с дробной частью. Примеры: 1.5|0, 1.5
Интересный факт; кажется, пригодится. Но, поскольку до сих пор самому рисовать карту не доводилось, трудновато понять, на именно тут делается акцент.
Правильно ли я думаю, что тормоза в «текущем решении» происходят оттого, что тысячи нанесённых объектов физически являются отдельными
Сама карта ни при чём (неважно, огромная картинка или тайлы), она лишь подложка к оверлейному слою.
А фишка именно в отрисовке огромного количества мелких мулек поверх неважно какой карты?
Точно.
Канвас не контейнер. Это «холст», картинка.
Комментарий для Евгения Степанищева:
Понимаю; но визуально и функционально эффект достигается именно такой.
Спасибо.
На айпаде не работает :(
интересно, почему?
Квадратики рисуются, но перетаскивание не работает. Так же как на сайте яндекс.карты в андроидных браузерах (nook color, viewsonic viewpad 10s)
а можно подробнее про различия в событиях?
Вот, например: http://www.sitepen.com/blog/2008/07/10/tou …
Там же есть обзор, что не работает в каких браузерах.
При увеличении прийдется масштабировать весь canvas на
А чтобы такое решение работало на мобильных устройствах с поддержкой жестов, нужно очень постараться. Производительность может быть даже ниже.
Тут: https://github.com/kothic/kothic-js/wiki/Browser-bugs
Откуда столько уровней? Вот текущий вид — это уже максимальное увеличение. Больше в этой задаче не требуется. И вообще, карты не масштабируют до бесконечности, какой в этом смысл?
Кроме того, я
Комментарий для shurshur.livejournal.com:
Полезная ссылка, спасибо!
отличную штуку нашёл, недалеко от темы http://paperjs.org/about/
Да их как грибов после дождя повылезало этих фреймворков. Чем именно