Pergunta

Eu tenho um problema pequeno de velocidade de execução. Em carga, gerar um CGMutablePath contendo, pelo menos, 1000 pontos. Quero percorrer este caminho na tela, então eu uso este tipo de código:

-(void) drawRect:(CGRect)rect {

    /*
    Here, I have a timer calling drawRect 60 times per second.
    There's also code for the scale and currentTime, based on
    an MP3 playback (AVAudioPlayer);
    */

    CGContextRef ref = UIGraphicsGetCurrentContext();   
    CGContextClearRect(ref, [self frame]);

    CGContextSaveGState(ref);
    CGContextTranslateCTM(ref, s.width/2+currentTime, 1);
    CGContextScaleCTM(ref, scale, 1);
    CGContextAddPath(ref, myGraphPath);
    CGContextSetRGBFillColor(ref, .1, .1, .1, .8);
    CGContextFillPath(ref);
    CGContextRestoreGState(ref);
}

O problema é que é um pouco lento, não muito, mas como eu preciso adicionar um lote inteiro mais de código gráfico ... Eu queria saber se o dispositivo está desenhando o caminho todo (uma vez que a escala é aplicada, o caminho é de cerca de 10.000 pixels de largura), ou apenas a parte visível no ecrã? O que posso fazer para otimizar isso?

Foi útil?

Solução 2

Depois de tentar um monte de coisas (como dividir a minha enorme caminho 1000 pontos em pequenos 10 pontos caminhos etc ...), eu tenho tudo portado para OpenGL, usando matrizes vértice simples. Levei cerca de 4 horas para a porta de tudo (mesmo escalando o caminho, rolando-lo, etc ...) e agora, eu recebo um 60fps cheia de animação o tempo todo, quando eu estava tendo apenas 22fps média com picos de 28 quando utilizar o CoreGraphics.

Outras dicas

Desenhar um de 1.000 pontos ou 10.000 pontos caminho 60 vezes por segundo é realmente vai abrandar o seu aplicativo para baixo, se é possível a todos. Se o caminho é estático, você realmente deve olhar em apenas desenhá-lo, uma vez dentro do seu UIView, de modo que ele é armazenado em cache dentro da camada do UIView, e animar a camada ao redor. Ele precisa ser animado, você pode olhar para o novo CAShapeLayer, que fornece a capacidade de animar um caminho Bezier simplesmente aplicando uma animação para sua propriedade caminho.

No entanto, 10.000 pixels vai ser maior do que o tamanho máximo de textura no iPhone (2048 x 2048), então você vai ter problemas para exibir que em qualquer modo de exibição padrão ou camada e pode precisar a qualquer dividi-lo em pedaços menores ou usar um CATiledLayer para torná-lo para a tela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top