CGContext Optimization - PullRequest
       10

CGContext Optimization

1 голос
/ 30 июля 2009

У меня небольшая проблема со скоростью бега. При загрузке я генерирую CGMutablePath, содержащий не менее 1000 точек. Я хочу прокрутить этот путь на экране, поэтому я использую такой код:

-(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);
}

Проблема в том, что это немного медленно, но не очень, но мне нужно добавить намного больше графического кода ... Мне было интересно, рисует ли устройство весь путь (после применения масштаба, путь составляет около 10.000 пикселей в ширину) или только часть, видимая на экране? Что я могу сделать, чтобы оптимизировать это?

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Попробовав много вещей (например, разделив мой огромный путь в 1000 точек на более мелкие пути в 10 точек и т. Д.), Я перенес все в openGL, используя простые массивы вершин. Мне потребовалось около 4 часов, чтобы портировать все (даже масштабировать путь, прокрутить его и т. Д.), И теперь я получаю полную анимацию 60 кадров в секунду все время, когда у меня было только среднее значение 22 кадров в секунду с пиками при 28 при использовании CoreGraphics.

1 голос
/ 30 июля 2009

60-секундное построение пути из 1000 или 10000 точек действительно замедлит работу вашего приложения, если это вообще возможно. Если путь статичен, вы действительно должны смотреть на его рисование в UIView только один раз, чтобы он кэшировался в слое UIView и анимировался вокруг слоя. Его нужно анимировать, вы можете взглянуть на новый CAShapeLayer, который предоставляет возможность анимировать путь Безье, просто применяя анимацию к его свойству пути.

Однако 10000 пикселей будет шире, чем максимальный размер текстуры на iPhone (2048 x 2048), поэтому у вас возникнут проблемы с отображением этого в любом стандартном виде или слое, и может потребоваться разбить его на более мелкие куски или используйте CATiledLayer, чтобы отобразить его на экране.

...