Один оператор в реализации метода занимает 90% времени выполнения. Заставляет приложение получать предупреждения памяти и сбой

У меня есть приложение для фотосъемки, которое использует AVFoundation. Когда пользователь нажимает кнопку, чтобы сделать снимок, происходит много вещей, таких как поворот фотографии в правильную ориентацию, кадрирование и т. Д.

При получении изображений я получал сообщения "Предупреждение о получении памяти" в консоли, и после того, как я собрал пару изображений и удалил их, приложение зависало в 99% случаев.

Я просто пошел и запустил приложение с инструментами, и есть один метод в дереве вызовов, который занимает 53,6% времени выполнения. Я дважды щелкнул по этому методу, и мне показали процент времени, потраченного на каждый оператор в реализации этого метода, и есть один отдельный оператор, который занимает 90,5% времени.

Очевидно, именно это вызывает проблемы с памятью и сбой приложения, но я не совсем уверен, почему или как это исправить.

Вот код реализации метода:

-(UIImage*) rotate:(UIImage*) src andOrientation:(UIImageOrientation)orientation

{
    UIGraphicsBeginImageContext(src.size);

    CGContextRef context=(UIGraphicsGetCurrentContext());

      if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, 90/180*M_PI) ;
       } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, -90/180*M_PI);
       } else if (orientation == UIImageOrientationDown) {
        // NOTHING
       } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, 90/180*M_PI);
        }


    [src drawAtPoint:CGPointMake(0, 0)];



    UIImage *img=UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

}

Утверждение, которое занимает 90,5% времени:

[src drawAtPoint:CGPointMake(0, 0)];

По сути, цель реализации этого метода заключается в том, чтобы повернуть захваченное фото в правильную ориентацию, поскольку iOS по умолчанию будет сохранять изображение в альбомной ориентации, даже если оно было просто захвачено в портретной ориентации. Таким образом, вы должны повернуть обратно в портрет, чтобы получить его так же, как он был захвачен.

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

0 ответов

Другие вопросы по тегам