Desempenho ao desenhar com frequência CGPaths
Estou trabalhando em um aplicativo para iOS que visualiza dados como um gráfico de linhas. O gráfico é desenhado como umCGPath
em uma tela personalizadaUIView
e contém no máximo 320 pontos de dados. Os dados são atualizados com freqüência e o gráfico precisa ser redesenhado de acordo. Uma taxa de atualização de 10 / s seria bo
Tão longe tão fácil. Parece, no entanto, que minha abordagem leva muito tempo da CPU. Atualizar o gráfico com 320 segmentos a 10 vezes por segundo resulta em 45% da carga da CPU para o processo em um iPhone 4S.
alvez eu subestime o trabalho gráfico sob o capô, mas para mim a carga da CPU parece muito para essa taref
Bow is mydrawRect()
função que é chamada sempre que um novo conjunto de dados está pronto.N
contém o número de pontos epoints
é umCGPoint*
vector com as coordenadas para desenha
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
// set attributes
CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);
CGContextSetLineWidth(context, 1.f);
// create path
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, NULL, points, N+1);
// stroke path
CGContextAddPath(context, path);
CGContextStrokePath(context);
// clean up
CGPathRelease(path);
}
Tentei renderizar o caminho para um CGContext offline antes de adicioná-lo à camada atual, conforme sugeridoaqu, mas sem nenhum resultado positivo. Eu também brinquei com uma abordagem de desenho diretamente para o CALayer, mas isso também não fez diferenç
Alguma sugestão de como melhorar o desempenho desta tarefa? Ou a renderização é simplesmente mais trabalhosa para a CPU que eu percebo? O OpenGL faria algum sentido / diferença?
Obrigado / Andi
Atualizar Eu também tentei usarUIBezierPath
ao invés deCGPath
. Esta postagemaqu dá uma boa explicação por que isso não ajudou. AjustandoCGContextSetMiterLimit
et al. também não trouxe grande alívio.
Update # 2: Eu finalmente mudei para o OpenGL. Foi uma curva de aprendizado íngreme e frustrante, mas o aumento de desempenho é simplesmente incrível. No entanto, os algoritmos de anti-aliasing da CoreGraphics fazem um trabalho melhor do que o que pode ser alcançado com a amostragem múltipla de 4x no OpenG