puntos lineas graficar dibujar con cocoa audio quartz-2d waveform cgpath

cocoa - graficar - dibujar lineas en java con el mouse



Método eficiente para trazar una línea con millones de puntos. (2)

Estoy escribiendo un editor de formas de onda de audio en Cocoa con una amplia gama de opciones de zoom. En su forma más amplia, muestra una forma de onda para una canción completa (aproximadamente 10 millones de muestras a la vista). En su forma más angosta, muestra una representación precisa en píxeles de la onda de sonido (~ 1 mil muestras en una vista). Quiero poder realizar una transición sin problemas entre estos niveles de zoom. Algunos editores comerciales como Ableton Live parecen hacer esto de una manera muy económica.

Mi implementación actual satisface mi rango de zoom deseado, pero es ineficiente y entrecortada. El diseño se inspira en gran medida en este excelente artículo sobre el dibujo de formas de onda con cuarzo:

http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/

Creo múltiples CGMutablePathRef para el archivo de audio en varios niveles de reducción. Cuando me alejé completamente, uso el camino que se ha reducido a un punto por x mil muestras. Cuando me acerco completamente, uso ese camino que contiene un punto para cada muestra. Escalo un camino horizontalmente cuando estoy entre niveles de reducción. Esto lo hace funcional, pero sigue siendo bastante caro y aparecen artefactos cuando se realiza la transición entre niveles de reducción.

Un pensamiento sobre cómo podría hacer que esto sea menos costoso es eliminar el anti-aliasing. La forma de onda en mi editor es suavizada, mientras que la de Ableton no lo es (ver comparación a continuación).

No veo una manera de desactivar el suavizado para CGMutablePathRef''s. ¿Existe una alternativa sin suavizado a CGMutablePathRef en el mundo de Cocoa? Si no es así, ¿alguien sabe de algunas clases de OpenGL o código de muestra que pueda establecer mi rumbo para dibujar mi enorme línea de manera más eficiente?

Actualización 1-21-2014: ahora hay una gran biblioteca que hace exactamente lo que estaba buscando: https://github.com/syedhali/EZAudio


En relación con la cuestión particular de anti-aliasing. En Quartz, el anti-aliasing se aplica al contexto en el momento del dibujo. El CGPathRef es agnóstico al contexto de dibujo. Por lo tanto, el mismo CGPathRef se puede representar en un contexto con antialias o en un contexto sin antialias. Por ejemplo, para deshabilitar el suavizado durante las animaciones:

CGContextRef context = UIGraphicsGetCurrentContext(); GMutablePathRef fill_path = CGPathCreateMutable(); // Fill the path with the wave ... CGContextAddPath(context, fill_path); if ([self animating]) CGContextSetAllowsAntialiasing(context, NO); else CGContextSetAllowsAntialiasing(context, YES); // Do the drawing CGContextDrawPath(context, kCGPathStroke);


Utilizo CGContextMoveToPoint + CGContextAddLineToPoint + CGContextStrokePath en mi aplicación. un punto por punto en pantalla para dibujar usando un búfer de respaldo precalculado para la descripción general. el búfer contiene los puntos exactos para dibujar, y utiliza una representación interpolada de la señal (basada en el zoom / escala). aunque podría ser más rápido y verse mejor si lo renderizo a un búfer de imagen, nunca he tenido una queja. puedes calcular y renderizar todo esto desde un hilo secundario, si lo configuras correctamente.

anti-aliasing pertenece al contexto de gráficos.

CGFloat (la entrada nativa para CGPaths) es una exageración para una descripción general, como una representación intermedia y para calcular la descripción de la forma de onda. 16 bits deben ser adecuados. por supuesto, tendrás que convertir a CGFloat cuando pases a llamadas CG.

necesita un perfil para saber en qué se gasta su tiempo: concéntrese en las partes que requieren más tiempo. también, asegúrese de que solo dibuja lo que debe, cuando debe, y evite las superposiciones / animaciones cuando sea posible. Si necesita superposiciones, es mejor renderizar a una imagen / búfer y actualizarlo según sea necesario. a veces es útil dividir la pantalla en múltiples superficies de dibujo cuando la superficie es grande.

semi-OT: los valores de s + h de ableton pueden ser un poco más rápidos, pero ... lo prefiero como opción. Si su implementación utiliza interpolación lineal (que puede, en función de su apariencia), considere un enfoque más intuitivo. La interpolación lineal es un poco engañosa, y realmente no es lo que el usuario esperaría si está desarrollando una aplicación profesional.