Sto cercando di scegliere la tecnologia giusta da utilizzare per aggiornare un progetto che fondamentalmente rende migliaia di punti in un grafico zoomabile e pannabile. L'attuale implementazione, utilizzando Protovis, è sottoperformante. Controllalo qui:
http://www.planethunters.org/classify
Ci sono circa 2000 punti quando si rimpicciolisce completamente. Prova a utilizzare le maniglie in basso per ingrandire un po 'e trascinalo per eseguire la panoramica. Vedrai che è piuttosto instabile e l'utilizzo della CPU probabilmente sale al 100% su un core a meno che tu non abbia un computer molto veloce. Ogni modifica all'area di messa a fuoco chiama un ridisegno di protovis che è dannatamente lento ed è peggiore con più punti disegnati.
Vorrei apportare alcuni aggiornamenti all'interfaccia e cambiare la tecnologia di visualizzazione sottostante per essere più reattiva con l'animazione e l'interazione. Dal seguente articolo, sembra che la scelta sia tra un'altra libreria basata su SVG o una basata su tela:
http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/
d3.js , che è nato da Protovis, è basato su SVG e dovrebbe essere migliore nel rendering delle animazioni . Tuttavia, sono dubbioso su quanto sia migliore e quale sia il suo limite di prestazioni. Per questo motivo, sto anche valutando una revisione più completa utilizzando una libreria basata su tela come KineticJS . Tuttavia, prima di arrivare troppo lontano nell'usare un approccio o un altro, mi piacerebbe sentire qualcuno che ha fatto un'applicazione web simile con così tanti dati e ottenere la sua opinione.
La cosa più importante sono le prestazioni, con un focus secondario sulla facilità di aggiungere altre funzionalità di interazione e programmare l'animazione. Probabilmente non ci saranno più di 2000 punti contemporaneamente, con quelle piccole barre di errore su ciascuno. Lo zoom avanti, indietro e la panoramica devono essere fluidi. Se le librerie SVG più recenti sono decenti in questo, allora forse la facilità d'uso di d3 supererà la maggiore configurazione per KineticJS, ecc. Ma se c'è un enorme vantaggio in termini di prestazioni nell'usare una tela, specialmente per le persone con computer più lenti, allora io preferirei decisamente andare in quel modo.
Esempio di app creata dal NYTimes che utilizza SVG, ma si anima ancora in modo accettabile e fluido: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html . Se riesco a ottenere quella performance e non devo scrivere il mio codice di disegno su tela, probabilmente sceglierei SVG.
Ho notato che alcuni utenti hanno utilizzato un ibrido di manipolazione d3.js combinato con il rendering su tela . Tuttavia, non riesco a trovare molta documentazione su questo in linea o entrare in contatto con l'OP di quel post. Se qualcuno ha esperienza con questo tipo di implementazione DOM-to-Canvas ( demo , codice ), mi piacerebbe sentire anche la tua opinione. Sembra essere un buon ibrido tra essere in grado di manipolare i dati e avere un controllo personalizzato su come renderli (e quindi sulle prestazioni), ma mi chiedo se dover caricare tutto nel DOM rallenterà ancora le cose.
So che ci sono alcune domande esistenti simili a questa, ma nessuna chiede esattamente la stessa cosa. Grazie per l'aiuto.
Follow-up : l'implementazione che ho finito per utilizzare è su https://github.com/zooniverse/LightCurves