2009-07-30 4 views
1

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

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

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

ответ

1

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

+0

Я рад, что вы это поняли, но стоит отметить, что с CG можно многое сделать, чтобы оптимизировать его, чтобы работать так же хорошо, если не возможно лучше. – Sneakyness

1

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

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

+0

Координаты точек пути являются статическими, но мне нужно прокрутить путь вдоль оси x в зависимости от масштабного коэффициента. Если я рисую форму на слое сразу после генерации, тогда масштабируйте ее, у меня много размытости (кстати, максимальный коэффициент масштабирования составляет около 1000). Если я масштабирую путь перед рисованием на слой, я получаю только пиксели s.width пикселей. И создание слоя такого размера не даст мне много улучшений:/ Собираюсь проверить CAShapeLayer, я еще не слышал об этом. Моя последняя ставка пытается использовать openGL, но с этим многоугольником, не уверен, что это действительно будет полезно. – melka