He estado tratando de averiguar cuál es la forma adecuada de representar datos en tiempo real como un gráfico de líneas en WPF. Y en realidad quiero decir en realidad, datos que se están recopilando de un dispositivo USB que genera datos a una velocidad de aproximadamente 40Hz. Hay múltiples (hasta 7) flujos de datos que estoy leyendo a 40Hz de manera asincrónica.Gráficos/visualización WPF de datos en tiempo real
He intentado usar dos soluciones estándar (gráficos de WPF Toolkit y gráficos Swordfish) y casi busqué en el componente Dynamic Data Visualization pero me rendí después de leer algunos comentarios en su foro. Parece que las soluciones de gráficos listas para usar están orientadas a gráficos estáticos y realmente necesito algo similar al Administrador de tareas de Windows, solo que es mucho más rápido y con muchos más puntos de datos.
Actualmente, he lanzado mi propia solución que parece funcionar mejor hasta el momento, pero tengo la sensación de que me falta algo porque parece que debería ser capaz de obtener un mejor rendimiento de la misma.
Los requisitos son que debería ser capaz de manejar un rango constante de aproximadamente 10000 puntos en una ventana deslizante: a medida que ingresan datos nuevos (a 40Hz), los datos viejos se desplazan hacia la izquierda fuera del rango visible. Y necesita mantener esta velocidad durante al menos 20 - 30 minutos (un total de aproximadamente 75 - 100 mil puntos por flujo de datos).
Mi implementación personalizada actual se basa en un componente que hereda de Shape y usa un StreamingGeometry para DefinigGeometry. Los datos que llegan del dispositivo se pasan al componente a través de una cola para mejorar el rendimiento debido al "efecto de estallido" inherente y, después de una operación de dequeue, el componente se invalida.
Entonces, mi pregunta es, ¿estoy en el camino correcto o estoy completamente equivocado? ¿Cuál es la forma más eficiente de lograr dicha visualización de datos en WPF? Cualquier ayuda o sugerencia sería muy apreciada.
La interoperabilidad de DirectX es la dirección. Algunos usarán SlimDX pero es una gran curva de aprendizaje de dependencia y abstracción. Recomiendo el uso directo de DX9 o (DX11 a través de DXGI) mientras agita con la interfaz D3DImage de WPF. Sigue siendo una curva de aprendizaje, pero igual que slimdx y más fácil de mantener para crear un dispositivo DX, contexto, búfer, shader y obtener su aplicación con Direct3D. Los documentos son terribles pero lo suficientemente buenos, y una vez hecho, has logrado algo genial sin dependencia de los demás. Vea nuestro mundo real [demostración de gráficos 18M] (http://www.gigasoft.com) con WPF WinForm MFC EXEs, principalmente audio WAV y datos GIS. – Robert
@Robert, gracias por la entrada. Idealmente me gustaría que w DX9 sea compatible con XP pero no pude deducir que dibuje líneas arbitrariamente gruesas con D3D de una manera comparable a la calidad de las rutas con alias que logré con WPF. ¿Alguna sugerencia? ¿Tuviste que escribir tu propia rutina de tesselación? Incluso estaría bien con DX10 si puedo obtener lo que quiero rendimiento/calidad. –
Las líneas gruesas son la desventaja más grande con D3D. Aunque no es un gran problema. Si puede diseñar alrededor de un tamaño de gráfico conocido, entonces la lógica del búfer de vértices conocerá un tamaño y es una simple cuestión de dibujar la línea como cuadrantes (triángulos dobles) b) si no desea reconstruir su búfer de vértices en función de un tamaño de evento, entonces el sombreador debe estar diseñado para mantener una relación de aspecto y ajustes de tamaño físico en un búfer constante, luego estos datos se utilizan dentro del sombreado de vértices para modificar los cuadrantes de línea sobre la marcha. Este es el caso para dx9/11. O puede usar D2D y la lógica de reducción de datos para trazar grandes cantidades. – Robert