Я рассматриваю различные архитектуры для системы, которая в идеале будет использовать рендеринг на стороне клиента для точечных объектов и должна быть без плагинов. Я использовал это приложение, разработанное в ответ на этот вопрос, для тестирования моего ноутбука (который вполне способен - четырехъядерный процессор с тактовой частотой 2,6 ГГц, 4 ГБ памяти, без какой-либо другой нагрузки, Firefox 8) с различным количеством точек в OpenLayers и он заметно отстает на 500 и начинает бороться за 1000. Кажется, что случайно сгенерированные функции не имеют каких-либо обработчиков событий и все используют одну и ту же символику.
Я рассчитываю показать до 1000 функций с 10 различными символами, все с обработчиками нажатия и наведения мыши, и на менее мощных платформах.
Я надеялся на лучшую производительность на стороне клиента, особенно после просмотра этого примера облака ГИС - я знаю, что он работает по-разному (HTML5 canvas против SVG), но разница в производительности действительно поразительна.
Мои ключевые вопросы (если вы будете так любезны):
- Является ли приложение для генерации случайных точек представителем производительности в других приложениях OpenLayers, которые вы написали / использовали?
- Существует ли проверенный и бесплатный альтернативный API веб-картографирования, который поддерживает службы WMS (который мне нужно использовать) и работает быстрее с функциями на стороне клиента, без использования Flash / Silverlight / любых других плагинов?
- Любые другие предложения о том, что я должен расследовать?
Опираться в первую очередь на рендеринг на стороне сервера - это вариант, но и я, и клиент хотели бы избежать этого из-за опасений по поводу увеличения количества пользователей и скорости отклика пользовательского интерфейса.
Ответы:
Ответ на 1-й вопрос - да . Вы используете OL с довольно распространенной конфигурацией. Есть приемы, которые можно использовать для повышения производительности, я вернусь к этому позже.
Возможно, ответ на вопрос 2 (особенно в отношении быстроты). Вы можете найти на этом сайте список альтернатив (одна из них, которая приходит на ум сейчас, это Leaflet ).
Ответ на вопрос 3: начните с измерения:
Я отредактировал локальную копию приложения, чтобы средство визуализации было явно указано в списке параметров для векторного слоя. Во время тестов я бы пропустил рендер Canvas, а затем перезагрузил страницу эксперимента с другим:
Я добавил таймер в функцию перерисовки, чтобы он выводил, сколько времени потратил на рисование :
После этого я попробовал несколько запусков на Chrome 17 и Firefox 8.0.1 на OSX SL с функциями 1000 и 5000. К моему удивлению, рендерер SVG в среднем на 20% быстрее рендера Canvas! (Примечание: в Windows время js не такое точное, как в OSX, поэтому результаты могут быть менее согласованными).
Это и вы говорите, что
IMHO говорит нам, что точка доступа находится в векторной обработке объектов. Работая над моим приложением, я недавно взглянул на него и решил выделить его подкласс, а затем избавиться от всего сложного кода, который бесполезен для простых моментов. По общему признанию я стал довольно диким и даже удалил зависимость от OpenLayers.Geometry.Point, и моя версия теперь работает на простых объектах js с атрибутами x, y.
Ваши варианты в порядке выгоды / стоимости:
Первый вариант - отфильтровать видимые точки на стороне сервера путем настройки опции стратегии для векторного слоя, как показано ниже:
Таким образом, при увеличении количества отображаемых объектов на стороне клиента будут отображаться только те элементы, которые будут отображаться, а не все.
В качестве второго варианта вы можете рассмотреть возможность написания настраиваемого вектора / рендерера . Пример нестандартной, ускоренной реализации доступен на моей странице github здесь . Хотя это не подходит для всех целей, этого должно быть достаточно, чтобы дать общее представление о том, что я предлагаю.
Третий вариант, когда пользователь полностью уменьшает масштаб, - это реализовать некоторую кластеризацию объектов на стороне сервера, чтобы точки слияния были объединены в одну, что снова уменьшило количество нарисованных объектов.
источник
Используя UTFGrid и TileMill, вы можете отображать неограниченное количество очков с довольно хорошей производительностью. Отображение n случайных точек является своего рода надуманным примером, который не сработает в этой ситуации или с GISCloud, или с любой другой магией, хотя - поскольку для взлома векторной производительности обычно требуется знание полного набора данных и некоторая предварительная обработка: и TileMill, и GISCloud делают много черепицы.
источник