Ho cercato di capire quale sia il modo appropriato per visualizzare dati in tempo reale come un grafico a linee in WPF. E in tempo reale intendo davvero, i dati raccolti da un dispositivo USB che genera dati a una velocità di circa 40Hz. Ci sono più (fino a 7) flussi di dati che sto leggendo a 40Hz in modo asincrono.Mappatura WPF/visualizzazione di dati in tempo reale
Ho provato a utilizzare due soluzioni off-the-shelf (grafici WPF Toolkit e Swordfish) e ho quasi esaminato il componente Dynamic Data Visualization, ma ci siamo arresi dopo aver letto alcuni commenti sul loro forum. Sembra che le soluzioni cartografiche standard siano orientate verso grafici statici e in realtà ho bisogno di qualcosa di simile al Task Manager di Windows - solo molto più velocemente e con un maggior numero di punti dati.
Attualmente ho eseguito il rollover della mia soluzione, che sembra funzionare al meglio finora, ma ho la sensazione che mi manchi qualcosa perché sembra che dovrei essere in grado di ottenere prestazioni migliori.
I requisiti sono che dovrebbe essere in grado di gestire un intervallo costante di circa 10000 punti in una finestra scorrevole - con l'arrivo di nuovi dati (a 40Hz), i dati vecchi vengono spostati a sinistra al di fuori dell'intervallo visibile. E ha bisogno di sostenere questo ritmo per almeno 20 - 30 minuti (per un totale di circa 75 - 100 mila punti per flusso di dati).
La mia implementazione personalizzata corrente si basa su un componente che eredita da Shape e utilizza un metodo StreamingGeometry per DefinigGeometry. I dati provenienti dal dispositivo vengono passati al componente tramite una coda per migliorare le prestazioni a causa dell'effetto "bursting" intrinseco e dopo l'operazione di annullamento della coda il componente viene invalidato.
Quindi, la mia domanda è, sono sulla buona strada o ho completamente torto? Qual è il modo più efficiente per realizzare tale visualizzazione dei dati in WPF? Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.
L'interoperabilità di DirectX è la direzione. Alcuni useranno slimDX ma è un'enorme dipendenza e una curva di apprendimento astratta. Raccomando l'uso diretto di DX9 o (DX11 via DXGI) mentre agita la mano con l'interfaccia D3DImage di WPF. Ancora una curva di apprendimento ma uguale a slimdx e più gestibile per creare un dispositivo DX, contesto, buffer, shader e ottenere l'app utilizzando Direct3D. I documenti sono terribili ma abbastanza buoni, e quando hai finito, hai realizzato qualcosa di interessante senza dipendenza dagli altri. Guarda il nostro mondo reale [18M charting demo] (http://www.gigasoft.com) con WPF WinForm MFC EXE, i suoi dati prevalentemente audio WAV e GIS. – Robert
@Robert, grazie per l'input. Idealmente mi piacerebbe inserire w DX9 per essere compatibile con XP, ma così non sono riuscito a capire no per disegnare linee spesse arbitrariamente con D3D in un modo paragonabile per qualità ai percorsi con l'alias che ho ottenuto con WPF. Qualche indicazione? Hai dovuto scrivere la tua routine di tessellazione? Sarei anche a posto con DX10 se riesco a ottenere ciò che voglio per prestazioni/qualità. –
Le linee spesse rappresentano il più grande inconveniente con D3D. Anche se non è un grosso problema. Se è possibile progettare attorno a una dimensione di grafico nota, la logica del buffer del vertice conoscerà una dimensione e sarà semplice disegnare la linea come quad (triangoli doppi) b) se non si desidera ricostruire il buffer dei vertici in base a un evento di dimensioni, quindi lo shader dovrebbe essere progettato per contenere un rapporto di aspetto e le impostazioni della dimensione fisica in un buffer costante, quindi questi dati utilizzati all'interno del vertex shader per modificare al volo i quad della linea. Questo è il caso di dx9/11. Oppure puoi usare D2D e la logica di riduzione dei dati per tracciare grandi quantità. – Robert