Вопрос

У меня небольшая проблема со скоростью бега. При загрузке я генерирую 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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top