Quiero trazar datos en tiempo real desde un dispositivo bluetooth. Tengo un dispositivo Bluetooth con el que el teléfono se conectará y leerá los datos que provengan de él. Los datos son niveles de voltaje de algunos sensores y tienen una frecuencia de muestreo de 300 muestras por segundo. La mayoría de las librerías de trazado (como aiChart, Android plot, achartengine, ...) que he visto no pueden manejar esa cantidad de datos y volver a pintar el gráfico. Así que busqué en OpenGL y Android NDK y parece que podría graficar usando cualquiera de estos con las tasas de muestra que tengo. ¿Alguien tiene un código de muestra para el trazado de gráfico de línea OpenGL en muestra de código de Android/Java y/o NDK?Gráfico dinámico Trazado con OpenGL en Android
Respuesta
Hicimos algo así simplemente creando una clase de matriz de puntos con varias páginas y dibujando en OpenGL con desplazamiento para que el punto actual esté siempre en el mismo lugar.
La idea es usar arreglos de tamaño fijo con un contador separado para no tener problemas de asignación de memoria que causarían la entrada de gc. Una vez que una página está llena, pase a la página siguiente mostrando la anterior también. La idea es que si tiene 5 páginas, puede escribir en una, mostrar las otras 3 y por lotes escribir la última en sqlite en una tarjeta SD en un hilo separado para que pueda extraer todos los datos más adelante.
Mientras que sólo tiene un hilo de escritura a la matriz que puede salirse con algo como
arrayPoint[] p;
....
int currentPos = 0;
arrayPoint current = p[currentPos];
.....
while(....
if(current.end < current.max)
{
.... get datax and datay
current.end++;
current.x[current.end] = datax;
current.y[current.end] = datay;
}
else
{
currentPos = getNextPos();
current = p[currentPos];
current.end = -1; // truncate the array without actually freeing or allocating mem
..... flip volatile bool to let other thread know its ok to get exclusive access to its data etc
}
Es muy rápido y debe hacer lo que necesita. A continuación, puede generar como un punto en un lienzo o dibujar en OpenGL es
Espero que ayude.
- 1. Gráfico dinámico personalizado en Android
- 2. Gráfico de trazado y trazado en OpenCV
- 3. Trazado de la biblioteca para OpenGL
- 4. Trazado dinámico en Gnuplot (dibujado en MATLAB)
- 5. Trazado y guardado gráfico R
- 6. Trazado de recorte en OpenGL ES 2.0
- 7. Comenzando con OpenGL ... en Android
- 8. Gráfico con nodos en Android
- 9. Recomendaciones sobre el trazado de un gráfico
- 10. Seleccione un dispositivo gráfico en Windows + OpenGL
- 11. Rendimiento de trazado de gradiente radial: ¿puede mejorar OpenGL-ES?
- 12. ¿Cómo hacer el trazado de rayos en OpenGL moderno?
- 13. cambio dinámico ViewStart camino trazado en MVC 3
- 14. trazado de histograma 3d/gráfico de barras en python matplotlib
- 15. Representador gráfico vectorial 2D para OpenGL
- 16. Visualización de gráfico dinámico simple para C++
- 17. OpenGL ES iPhone - el trazado de líneas anti-aliasing
- 18. Trazado 'Hola' en MATLAB
- 19. Trazado de flechas con gnuplot
- 20. Android Live Wallpapers con OpenGL ES 2.0?
- 21. Recurso dinámico Cargando Android
- 22. trazado en 3D con python
- 23. Trazado de una 2da matriz con mplot3d
- 24. Problema de OpenGL en Android
- 25. Android opengl textura corrupción
- 26. gnuplot con errorbars trazado
- 27. dinámico APK Android
- 28. Android OpenGL selección 3D
- 29. Dibujar gráfico circular en Android?
- 30. android juego opengl
Tu idea tiene sentido acerca de la escritura para decir 5 páginas de datos ... de hecho, la última página puede enviarse a un proceso/hilo secundario para escribir en SD. Aunque su método de código no iría, eso parece demasiado lento. Como los datos pueden ser de tamaño y tasas variables, y presionar una matriz, digamos cuando tienes 10 nuevos puntos de datos y la nueva indexación sería demasiado lenta. De ahí que use LinkedLists si este es el código Java del que estamos hablando. – JPM
Una pregunta en su código OpenGL ¿lo escribió en Android/Java o en C/NDK? – JPM
Hola JPM La razón por la que fui con las matrices estáticas es para evitar gc, ya que ese era mi cuello principal de botella. He descubierto por experiencia personal que las clases dinámicas crean miles de objetos y que matarán cualquier posibilidad de mantener el flujo de datos rápido. El uso de una matriz estática con un índice para el final significa su única operación para restablecerlo (estableciendo el final en -1) y los datos se escriben como agregados. Juega con DDMS y puedes rastrear dónde estás creando objetos. Escribí todo en Android Java y fue lo suficientemente rápido una vez que eliminé GC. – Kactus