Ich versuche, die richtige Technologie für die Aktualisierung eines Projekts auszuwählen, das im Grunde Tausende von Punkten in einem zoombaren, pannbaren Diagramm wiedergibt. Die aktuelle Implementierung mit Protovis ist unterdurchschnittlich. Schau es dir hier an:
http://www.planethunters.org/classify
Bei vollständiger Verkleinerung gibt es ungefähr 2000 Punkte. Versuchen Sie, mit den Griffen unten etwas zu zoomen, und ziehen Sie es, um es zu schwenken. Sie werden sehen, dass es ziemlich abgehackt ist und Ihre CPU-Auslastung auf einem Kern wahrscheinlich bis zu 100% steigt, es sei denn, Sie haben einen wirklich schnellen Computer. Jede Änderung des Fokusbereichs führt zu einer Neuzeichnung von Protovis, die verdammt langsam ist und mit mehr gezogenen Punkten schlechter ist.
Ich möchte einige Aktualisierungen an der Benutzeroberfläche vornehmen und die zugrunde liegende Visualisierungstechnologie ändern, um schneller auf Animation und Interaktion reagieren zu können. Aus dem folgenden Artikel geht hervor, dass Sie zwischen einer anderen SVG-basierten Bibliothek und einer Canvas-basierten Bibliothek wählen können:
http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/
d3.js , das aus Protovis hervorgegangen ist, basiert auf SVG und soll Animationen besser rendern können . Ich bin jedoch zweifelhaft, wie viel besser und wie hoch die Leistungsobergrenze ist. Aus diesem Grund erwäge ich auch eine umfassendere Überarbeitung mit einer Canvas-basierten Bibliothek wie KineticJS . Bevor ich mich jedoch zu weit mit dem einen oder anderen Ansatz befasse, würde ich gerne von jemandem hören, der eine ähnliche Webanwendung mit so vielen Daten erstellt hat, und seine Meinung einholen.
Das Wichtigste ist die Leistung, wobei der Schwerpunkt auf der einfachen Hinzufügung anderer Interaktionsfunktionen und der Programmierung der Animation liegt. Es wird wahrscheinlich nicht mehr als 2000 Punkte auf einmal geben, mit diesen kleinen Fehlerbalken auf jedem. Das Vergrößern, Verkleinern und Schwenken muss reibungslos sein. Wenn die neuesten SVG-Bibliotheken diesbezüglich anständig sind, überwiegt möglicherweise die einfache Verwendung von d3 das erhöhte Setup für KineticJS usw. Wenn die Verwendung einer Zeichenfläche jedoch einen enormen Leistungsvorteil bietet, insbesondere für Benutzer mit langsameren Computern, dann ich würde definitiv lieber diesen Weg gehen.
Beispiel für eine App von NYTimes, die SVG verwendet, aber dennoch akzeptabel reibungslos animiert: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html . Wenn ich diese Leistung erzielen kann und keinen eigenen Canvas-Zeichencode schreiben muss, würde ich mich wahrscheinlich für SVG entscheiden.
Ich habe festgestellt, dass einige Benutzer eine Mischung aus d3.js-Manipulation und Canvas-Rendering verwendet haben . Ich kann jedoch online nicht viel Dokumentation finden oder mich mit dem OP dieses Beitrags in Verbindung setzen. Wenn jemand Erfahrung mit dieser Art der Implementierung von DOM-to-Canvas ( Demo , Code ) hat, würde ich gerne auch von Ihnen hören. Es scheint eine gute Mischung aus der Möglichkeit zu sein, Daten zu manipulieren und die benutzerdefinierte Kontrolle über das Rendern (und damit die Leistung) zu haben, aber ich frage mich, ob das Laden von allem in das DOM die Dinge immer noch verlangsamen wird.
Ich weiß, dass es einige Fragen gibt, die dieser ähnlich sind, aber keine von ihnen stellt genau das Gleiche. Danke für Ihre Hilfe.
Follow-up : Die Implementierung, die ich letztendlich verwendet habe, befindet sich unter https://github.com/zooniverse/LightCurves