Я пытаюсь выбрать правильную технологию для использования для обновления проекта, который в основном отображает тысячи точек в масштабируемом графике. Текущая реализация, использующая Protovis, является недостаточной. Посмотрите здесь:
http://www.planethunters.org/classify
Есть около 2000 точек, когда они полностью уменьшены. Попробуйте использовать ручки внизу, чтобы немного увеличить изображение, и перетащите его, чтобы панорамировать. Вы увидите, что это довольно прерывисто, и использование вашего процессора, вероятно, до 100% на одном ядре, если у вас нет действительно быстрого компьютера. Каждое изменение в области фокусировки вызывает перерисовку протовиз, которая довольно медленна и хуже с большим количеством нарисованных точек.
Я хотел бы сделать некоторые обновления для интерфейса, а также изменить базовую технологию визуализации, чтобы быть более отзывчивыми с анимацией и взаимодействием. Из следующей статьи кажется, что выбор между другой библиотекой на основе SVG или на основе холста:
http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/
d3.js, который вырос из Protovis, основан на SVG и должно быть лучше для рендеринга анимации. Тем не менее, я сомневаюсь в том, насколько лучше и каков его потолок производительности. По этой причине я также рассматриваю более полную перестройку, используя библиотеку на основе canvas, такую как KineticJS. Однако, прежде чем я слишком далеко буду использовать тот или иной подход, я хотел бы услышать от кого-то, кто сделал подобное веб-приложение с этим большим количеством данных и получил свое мнение.
Самая важная вещь - производительность, с упором на удобство добавления других функций взаимодействия и программирования анимации. Вероятно, будет не более 2000 точек одновременно с этими небольшими барами ошибок на каждом из них. Масштабирование, выключение и панорамирование вокруг должны быть плавными. Если последние библиотеки SVG достойны этого, то, возможно, простота использования d3 перевешивает увеличенную настройку для KineticJS и т.д. Но если есть огромное преимущество в производительности использования холста, особенно для людей с более медленными компьютерами, тогда я определенно предпочел бы пойти таким образом.
Пример приложения, сделанного NYTimes, который использует SVG, но все равно анимируется приемлемо гладко: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html. Если я смогу получить эту производительность и не буду писать свой собственный код рисования холста, я бы, вероятно, пошел на SVG.
Я заметил, что некоторые пользователи использовали гибрид d3.js манипуляции в сочетании с рендерингом canvas. Однако я не могу найти много документации об этом онлайн или связаться с OP этого сообщения. Если у кого-то есть опыт выполнения такого типа DOM-to-Canvas (demo, код), я хотел бы также услышать от вас. Кажется, это хороший гибрид, позволяющий манипулировать данными и настраивать контроль над их рендерингом (и, следовательно, производительность), но мне интересно, стоит ли загружать все в DOM, все еще замедляет работу.
Я знаю, что есть некоторые существующие вопросы, похожие на это, но никто из них точно не спрашивает одно и то же. Благодарим за помощь.
Последующие действия: реализация, которую я закончил, находится на https://github.com/zooniverse/LightCurves