«Выполнение дорогостоящей операции разматывания!» - что это и как это исправить? - PullRequest
5 голосов
/ 17 ноября 2011

Консоль отладки для моего тестового приложения Core Filters показывает следующее сообщение:

CGImageRef 0x7a0e890 имеет заполнение байтов строк. Выполнение дорогостоящей операции восстановления!

Мне не удалось найти попадание для этого точного сообщения (за исключением информации об указателе) в заголовках или в поиске Google.

Мои вопросы: (1) что это значит и (2) как я могу исправить ситуацию?

Ниже приведен пример того, как я генерирую отфильтрованный UIImage, используя CIFilter.

- (UIImage*)sepia
{    
    CIImage *beginImage = [CIImage imageWithCGImage:[self CGImage]];
    CIContext *context = [CIContext contextWithOptions:nil];

    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];
    CIImage *outputImage = [filter outputImage];

    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];

    self = newImg;

    CGImageRelease(cgimg);
    return self;
}

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

Заполнение байтов - это дополнительные байты, добавляемые в конец каждой строки изображения, чтобы каждая строка начиналась с 2 ^ n-байтового кратного в памяти.Это увеличивает производительность доступа к памяти за счет размера изображения.Вы можете проверить это, если сравниваете результат CGImageGetBytesPerRow и ожидаемые байты на строку, рассчитанные на основе размеров изображения и байтов на пиксель.

Что касается того, как исправить выпадение - вам нужно точно определить, какая операция вызываетраспаковка и бери оттуда.Распаковка обходится дорого, потому что в основном необходимо полностью перемешать память изображения, чтобы удалить все пробелы в конце строки.

1 голос
/ 27 июня 2012

Я бы написал комментарий, но поскольку я не могу этого сделать из-за низкой репутации, которую я имею, я опубликую его здесь как ответ:

У меня просто была та же ошибка, и я пыталсяисправить это с помощью предложения Thuggish Nuggets.Оказалось, что это правильный подход, однако размер изображения должен быть множеством 8. Я просто выровнял ширину с множеством 8, я не знаю, должна ли высота также быть множеством 8, так как изображение, которое яВ любом случае, этот подход был проверен на квадратичность.

Вот (вероятно, не очень эффективный) алгоритм, чтобы дать вам базовую идею о том, как рассчитать необходимый размер:

UIImage *image = ...;
CGSize targetSize = image.frame.size; //e.g. 51 x 51
double aspectRatio = targetSize.width / targetSize.height;
targetSize.width = targetSize.width + 8 - ((int)targetSize.width % 8);
targetSize.height = targetSize.width / aspectRatio;
0 голосов
/ 27 апреля 2013

Я подозреваю, что «дорогостоящая операция разрыхления» является фиктивной. Причина: я получаю его на симуляторе, но не на устройстве. Поэтому я считаю, что это вводящий в заблуждение артефакт среды симулятора.

...