Швидкі та чуйні інтерактивні діаграми / графіки: SVG, Canvas, інші?


114

Я намагаюся вибрати правильну технологію, яку слід використовувати для оновлення проекту, який, в основному, відображає тисячі балів у масштабованому, панорамуваному графіку. Поточна реалізація, використовуючи Protovis, є недостатньо ефективною. Перевірте це тут:

http://www.planethunters.org/classify

При повному зменшенні масштабів існує близько 2000 балів. Спробуйте скористатися ручками внизу, щоб трохи збільшити масштаб, і перетягніть їх, щоб обернути панораму. Ви побачите, що це досить спритно, і використання вашого процесора, ймовірно, досягає 100% на одному ядрі, якщо у вас немає справді швидкого комп'ютера. Кожна зміна зони фокусування викликає перемальовування протовісу, який досить проклятий повільно і гірший із тим, що більше очок набрано.

Я хотів би зробити деякі оновлення інтерфейсу, а також змінити базову технологію візуалізації, щоб бути більш чутливою до анімації та взаємодії. З наступної статті, схоже, що вибір є між іншою бібліотекою на основі SVG або на базі полотна:

http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/

d3.js , який виріс із протовісу, базується на SVG і повинен краще працювати з анімацією . Однак я сумніваюсь у тому, наскільки краще та яка плафона його продуктивності. З цієї причини я також розглядаю можливість більш повного капітального ремонту за допомогою бібліотеки на основі полотна на зразок 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 у поєднанні з відображенням полотна . Однак я не можу знайти багато документації щодо цього в Інтернеті чи зв’язатися з ОП на цій посаді. Якщо хтось має досвід роботи з подібною реалізацією DOM-to-Canvas ( демо , код ), я хотів би також почути від вас. Здається, це хороший гібрид того, що можна маніпулювати даними та мати власний контроль над тим, як їх рендерувати (і, отже, на продуктивність), але мені цікаво, чи потрібно все завантажувати в DOM, все одно сповільнить справи.

Я знаю, що є деякі існуючі запитання, подібні до цього, але жодне з них не задає те саме. Спасибі за вашу допомогу.

Наступні дії : реалізація, яку я закінчила використовувати, знаходиться за адресою https://github.com/zooniverse/LightCurves


"Найважливіше - це продуктивність, з другорядним фокусом на простоті додавання іншої взаємодії" +1 для полотна
philipp

Питання в тому, чи достатньо SVG у більшості браузерів для 2k балів + інших елементів діаграми? Якщо так, а повільність якраз пов’язана із слабкістю протовісів, то я б скоріше дотримувався SVG.
Ендрю Мао

1
Майк Босток дав гарну відповідь. Для деяких ДОДАТКОВО ви можете перевірити ці два ресурси: stackoverflow.com/questions/5882716/html5-canvas-vs-svg-vs-div / ... blogs.msdn.com/b/ie/archive/2011/04/22 /…
Ümit

8
Наступні дії: Я реалізував це за допомогою гібридного підходу SVG / canvas, де SVG піклується про осі та сітки лінії, і полотно може виводити точки дуже швидко. Це супер швидко!
Ендрю Мао

Відповіді:


183

На щастя, малювання 2000 кіл є досить простим прикладом для перевірки. Ось ось чотири можливі реалізації, по два Canvas та SVG:

Ці приклади використовують поведінку масштабу D3 для здійснення масштабування та панорамування. Окрім того, чи відображаються кола у Canvas чи SVG, інша основна відмінність полягає у використанні геометричного чи семантичного масштабування.

Геометричне масштабування означає, що ви застосовуєте єдине перетворення до всього огляду: коли ви збільшуєте, кола збільшуються. Семантичне збільшення на контрасті означає, що ви застосовуєте перетворення до кожного кола окремо: коли ви збільшуєте, кола залишаються однакового розміру, але вони розширюються. Planethunters.org в даний час використовує семантичне масштабування, але це може бути корисно розглянути інші випадки.

Геометричне масштабування спрощує реалізацію: ви застосовуєте переклад і масштаб один раз, а потім усі кола повторно відображаються. Реалізація SVG є особливо простою, оновивши єдиний атрибут "перетворення". Виконання обох прикладів геометричного масштабування вважається більш ніж адекватним. Для семантичного масштабування ви помітите, що D3 значно швидший, ніж Protovis. Це тому, що це робить набагато менше роботи для кожного масштабування. (Версія Protovis повинна перерахувати всі атрибути на всіх елементах.) Семантичне масштабування на основі полотна трохи більше, ніж SVG, але семантичне масштабування SVG все ще відчуває чуйність.

Але не існує чарівної кулі для виконання, і ці чотири можливі підходи не починають охоплювати повний простір можливостей. Наприклад, ви можете комбінувати геометричне та семантичне масштабування, використовуючи геометричний підхід для панорамування (оновлення атрибуту "перетворення") та лише перемальовування окремих кіл під час збільшення. Напевно, ви могли навіть поєднати одну або декілька з цих методів з перетвореннями CSS3, щоб додати деяке апаратне прискорення (як у прикладі ієрархічного розширення ребер ), хоча це може бути складним у застосуванні та може запровадити візуальні артефакти.

Тим не менш, мої особисті переваги - зберігати якомога більше у SVG та використовувати Canvas лише для "внутрішнього циклу", коли візуалізація - це вузьке місце . SVG має стільки зручностей для розробки - такі як CSS, з'єднання даних та інспектор елементів - що часто можна передчасна оптимізація починати з Canvas. Поєднання Canvas з SVG, як і у візуалізації IPO Facebook, яку ви пов’язали, - це гнучкий спосіб зберегти більшість цих зручностей, але при цьому ви отримуєте найкращі показники. Я також використав цю техніку в Cubism.js , де окремий вигляд візуалізації часових рядів добре підходить до кешування растрових зображень.

Як показують ці приклади, ви можете використовувати D3 з Canvas, навіть якщо частини D3 мають специфіку SVG. Дивіться також цей графік, керований силою та цей приклад виявлення зіткнень .


Нічого собі, це була приголомшлива відповідь і від самого майстра візуалізації! Я думаю, що мені доведеться дотримуватися семантичного масштабування, і на моєму комп’ютері рендері на основі полотна набагато швидше, ніж версія SVG, коли панорамування / масштабування (можливо, це стосується впровадження браузера?). Те, що ви сказали про використання SVG з полотном як внутрішнього циклу, - це саме те, що я хотів підтвердити, а приклади коду - просто приємний бонус. Дуже дякую!
Ендрю Мао

Просто виникла думка спробувати приклади семантичного масштабування в різних браузерах: Chrome, обидва досить швидко, я не можу визначити різницю; IE: SVG трохи повільніше; Firefox (останній коментар): SVG привіт повільно порівняно з полотном. Я думаю, що також трохи ускладнює рішення, але робить полотно рендеринга безпечним вибором. Ще одне питання: чи використання KineticJS замість полотна безпосередньо вплине на продуктивність?
Ендрю Мао

1
Ендрю, трохи пізно, але ось мій досвід роботи з FF: Це наздоганяє. Я використовував FF 15 та D3 SVG переходи швидко почав повільно. Але кожна нова версія стала значно швидшою. Зараз я перебуваю на FF 18 beta, і це швидко порівняно з 17. Не впевнений, чи він такий гладкий, як хром.
user2503795

@AndrewMao Привіт Ендрю, я стикаюся з ситуацією, коли здається, що надання є вузьким місцем. Мені потрібно панорамувати і збільшувати деякі точки і приблизно 6000 кривої шляху. stackoverflow.com/questions/17907769/svg-path-rendering-speed/… Але я не зовсім розумію Бостока, коли він сказав: "тримайте якомога більше у SVG, і використовуйте Canvas лише для" внутрішньої петлі "" хоч роздивився чотири приклади .. Не могли б ви пролити трохи світла?
kakacii

@kakacii перетворення однаково повільне у всіх браузерах? Якщо так, я б сказав, що ви або використовуєте неправильний код, або ви досягли меж відображення браузера. Якщо ви можете опублікувати якийсь код, я можу допомогти. mbostock мав на увазі використання SVG для простоти маніпуляцій та полотна лише за необхідності, оскільки це складніше кодувати. Однак такі бібліотеки, як KineticJS, певною мірою спростили це.
Ендрю Мао

8

Я думаю, що у вашому випадку рішення між полотном та svg не є рішенням між "їздом на коні" або їздом на "Porsche". Для мене це більше схоже на рішення щодо кольору автомобілів.

Дозвольте мені пояснити: якщо припустити, що виходячи з рамки операцій

  • намалювати зірку,
  • додати зірку і
  • зняти зірку

приймати лінійний час. Отже, якщо ваше рішення рамки було гарним, це трохи швидше, інакше трохи повільніше.

Якщо ви продовжуєте припускати, що рамки просто швидкі, ніж стає абсолютно очевидно, що недостатня продуктивність викликана великою кількістю зірок, а обробка ними - це те, що жоден з фреймворків не може зробити для вас, принаймні, я не знаю про це.

Що я хочу сказати, це те, що основа задачі призводить до основної проблеми обчислювальної геометрії, а саме: пошуку в діапазоні та ще однієї комп'ютерної графіки: рівень деталізації .

Щоб вирішити проблему з продуктивністю, вам потрібно застосувати хороший препроцесор, який здатний дуже швидко знайти, які зірки відображати, і, можливо, здатний кластеризувати зірки, які знаходяться близько один від одного, залежно від масштабування. Єдине, що підтримує ваш погляд яскравим і швидким - це зберегти кількість зірок, щоб намалювати якомога менше.

Як ви заявляли, що найважливіше - це продуктивність, ніж я б схильний використовувати полотно, оскільки воно працює без операцій DOM. Він також пропонує можливість використовувати webGL, що значно підвищує графічну ефективність.

BTW: Ви перевіряли paper.js ? Він використовує полотно, але імітує векторну графіку.

PS: У цій книзі ви можете знайти дуже детальну дискусію про графіку в Інтернеті, технології, плюси та мінуси полотна, SVG та DHTML.


7

Нещодавно я працював на інформаційній панелі майже в реальному часі (оновлювати кожні 5 секунд) і вирішив використовувати діаграми, які відображають за допомогою полотна.

Ми спробували Highcharts (бібліотека графіків JavaScript на основі SVG) та CanvasJS (бібліотека JavaScript на основі полотна на основі Canvas). Хоча Highcharts - це фантастичний графічний інтерфейс API і пропонує набагато більше можливостей, ми вирішили використовувати CanvasJS.

Нам потрібно було показати щонайменше 15 хвилин даних на графік (з можливістю вибору діапазону максимум дві години).

Отже, за 15 хвилин: 900 балів (точка даних за секунду) x2 (лінія поєднання ліній та смуг) x4 діаграми = 7200 балів.

Використовуючи хромований профілер, за допомогою CanvasJS пам'ять ніколи не перевищувала 30 Мб, тоді як використання пам'яті Highcharts перевищувало 600 Мб.

Також із часом оновлення 5 секунд візуалізація CanvasJS була більш чутлива, ніж Highcharts.

Ми використовували один таймер (setInterval 5 секунд), щоб здійснити 4 виклики REST API, щоб витягнути дані з сервера на задньому кінці, який підключився до Elasticsearch. Кожен графік, оновлений у вигляді даних, отримує JQuery.post ().

Це говорило для офлайн-звітів, я б працював з Highcharts з моменту його більш гнучкого API.

Також є діаграми Zing, які стверджують, що використовують SVG чи Canvas, але не переглядали їх.

Полотно слід враховувати, коли продуктивність дійсно критична. SVG для гнучкості. Не те, що рамки полотна не є гнучкими, але для того, щоб отримати таку ж функціональність, як SVG, потрібно більше роботи для полотна.



0

Я також виявив, що коли ми друкуємо на PDF сторінку з SVG графікою, отриманий PDF все ще містить векторне зображення, тоді як якщо ви друкуєте сторінку з графікою Canvas, зображення в отриманому PDF-файлі буде растеризовано.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.