2011-08-03 14 views
5

Estoy escribiendo un programa en C++ que adquiere datos de puntos de 4 dimensiones sobre un socket UDP y luego traza los datos en 6 gráficos de dispersión 2D por separado. Por ejemplo, si nombramos las dimensiones: A, B, C, D, los seis gráficos 2D serían AxB, AxC, AxD, BxC, BxD y CxD. En el transcurso de unas pocas horas, el programa acumula ~ 50K puntos.La mejor manera de dibujar un diagrama de dispersión con muchos puntos de datos en C++ usando OpenGL

Actualmente trazado cada punto una vez, usando el modo inmediato. No elimino el búfer entre las llamadas al sorteo, por lo que los puntos previamente graficados persisten hasta que se borre el búfer. No estoy contento con este método ya que el modo inmediato es lento y obsoleto. Cuando tengo que borrar el búfer, como cuando una ventana cambia de tamaño, pierdo todos los datos graficados previamente. Me gustaría encontrar una solución que permita la persistencia de los datos una vez que se borre el buffer. Además, sería bueno si la trama pudiera escalarse fácilmente con los tamaños de ventana también.

He pensado en mantener una matriz de vértices (con 2 dimensiones) para cada sistema de coordenadas, pero eso requeriría 6 matrices separadas y requeriría 3 veces la memoria de mantener una matriz con las 4 dimensiones.

¿Estoy pensando en esto de la manera correcta? ¿Cuál es la solución adecuada para este problema?

El objetivo final es tener una aplicación que muestre los datos lo más cerca posible en tiempo real.

Editar ¿Sería posible seguir trazando los puntos uno por uno a medida que entran, y cuando tengo que cambiar el tamaño de la pantalla tomar una imagen de la pantalla y luego mostrar una versión de tamaño de esa imagen?

Respuesta

5

Uso del búfer Vértice Los objetos pueden aumentar la velocidad de renderizado, ya que la geometría para dibujar se puede almacenar directamente en la memoria de la tarjeta gráfica. Sin embargo, en su caso, si los datos siempre cambian, no puedo decirle si este método será más rápido que el modo inmediato, ya que es posible que tenga que reconstruir el Objeto Vertex Array cada vez que cambien los datos. Si solo agrega puntos, tal vez pueda crear varias VBO para agrupar puntos, y renderizar los últimos puntos recibidos usando el modo inmediato hasta que pueda crear un nuevo grupo. Por ejemplo, si recibiste 100054 puntos, tal vez puedas hacer 10 grupos de 10000 puntos y renderizar los últimos 54 puntos en modo inmediato.

En cuanto al problema de la memoria, creo que es posible almacenar en los vértices de la tarjeta gráfica con 4 elementos - entonces podría usar diferentes sombreadores de vértices que seleccionan qué componentes de su vértice utilizar como coordenadas de representación. Con esta técnica, el uso de la memoria solo sería el doble de lo que recibió: uno para usted recibió datos y otro para el objeto del búfer de vértices.

+2

Los VBO deben ser al menos no más lentos que los arrays del lado del cliente y son definitivamente más rápidos que el modo inmediato. La VBO (y las matrices de vértices en general) no son solo para la copia de memoria sino también para la sobrecarga del controlador. –

+0

Uno probablemente podría salirse con la suya variando los argumentos 'stride' y' pointer' a 'glVertexPointer' en lugar de tener que tener sombreadores de vértices diferentes para las diferentes vistas. – user786653

+0

@Christian Gracias por tu comentario, no estaba seguro. – neodelphi

Cuestiones relacionadas