2013-11-28 2 views
5

Ich habe eine Echtzeit-Grafik erstellt, wo neue Datenpunkte kontinuierlich eingespeist und geplottet werden.Effiziente Continuous Scrolling Graph mit SVG HTML CSS

Derzeit verwende ich requestAnimationFame(), wo ich die aktualisierte Positionen der Elemente 30 Mal pro Sekunde rendern.

Bei vielen SVG-Elementen kann dies etwas langsam werden.

Was ist der effizienteste Weg, um ein kontinuierlich scrollendes Diagramm wie dieses mit SVG-Animationen, CSS-Animationen oder CSS-Übergängen zu implementieren. (Ohne Bibliotheken von Drittanbietern).

Vielen Dank im Voraus.

+0

Müssen Sie alle anzeigen? – agconti

+0

Nein, ein Fenster der letzten 30 Sekunden ist in Ordnung. – klyngbaek

Antwort

2

Hier ist eine ziemlich gute Lösung in einem Fiddle.

Es ist von Mike Bostock und sein tolles Tutorial zur Verwendung D3. In diesem Tutorial; Mike erklärt, wie der Fiddle von Grund auf neu zu erreichen, aber der wichtige Teil ist für Sie die redraw Funktion:

function redraw() { 

    var rect = chart.selectAll("rect") 
     .data(data, function (d) { 
     return d.time; 
    }); 

    rect.enter().insert("rect", "line") 
     .attr("x", function (d, i) { 
     return x(i + 1) - .5; 
    }) 
     .attr("y", function (d) { 
     return h - y(d.value) - .5; 
    }) 
     .attr("width", w) 
     .attr("height", function (d) { 
     return y(d.value); 
    }) 
     .transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i) - .5; 
    }); 

    rect.transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i) - .5; 
    }); 

    rect.exit().transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i - 1) - .5; 
    }) 
     .remove(); 

} 

Es wird eine neue rect basierend auf eingehenden Daten hinzufügen und die älteste rect verblassen, und so erzeugt die gewünschte Scrollen Aktion. Dies sollte ziemlich einfach an Ihre Bedürfnisse angepasst werden, aber es wird eine bestimmte Menge an Rezepten angenommen.

Es scheint, dass Sie möglicherweise eine unbegrenzte Menge von Rekten auf dem Bildschirm zu einem bestimmten Zeitpunkt aus Ihrer Frage haben möchten, aber letztlich ist dies nicht wünschenswert. Sie können die Anzahl der anzuzeigenden Rezkte auf die größte Menge festlegen, die Ihrer Site immer noch erlaubt, performant zu sein. Mehr und es wird für Sie und Ihre Benutzer abstürzen. Ein Fading nach außen zu verblassen ist effizienter als das fortlaufende Laden, sobald der Svg-Wert hoch genug ist.

+0

Danke, dies ist ein großartiges Tutorial, aber ich möchte keine Bibliotheken von Drittanbietern wie D3 verwenden. Ich habe mich gefragt, was eine solche Animation so effizient macht. Verwenden sie CSS-Übergänge? – klyngbaek

+1

Warum möchten Sie keine Bibliotheken von Drittanbietern verwenden? Dies kann alles in reinem Java-Skript gemacht werden (so macht es die Bibliothek), aber es würde unnötig viel zusätzliche Entwicklungszeit erfordern, um es selbst zu machen. Ich empfehle d3, weil es so gut gemacht ist. – agconti

+0

Sie können durch das d3-Projekt graben und es als eine Straßenkarte verwenden, um dies selbst in reinem js zu tun. – agconti