Core Graphics имеет плохую производительность итераций PIXEL на iPhone? - PullRequest
1 голос
/ 30 августа 2009

Я пытаюсь выполнить итерацию для пикселей, чтобы изменить значения RGBA UIImage без использования OpenGL. Я попытался протестировать производительность итераций, используя приведенный ниже код, но был очень недоволен. Казалось, что я мог получить только несколько тысяч итераций в секунду. А для UIImage с несколькими сотнями тысяч пикселей это займет СЛИШКОМ ДЛИННОЕ ... У кого-нибудь есть какие-либо предложения о том, как повысить производительность или как обычно должны выполняться такие операции?

-(UIImage*)modifyPixels:(UIImage*)originalImage
{
    NSData* pixelData = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(originalImage.CGImage));
    void* pixelBytes = [pixelData bytes];

    // Take away the red pixel, assuming 32-bit RGBA
    for(int i = 0; i < [pixelData length]; i += 4) {
        NSLog(@" %ith iteration (%i / %i / %i / %i)", i, pixelData[i], pixelData[i+1], pixelData[i+2], pixelData[i+3]);
    }

    //NSData* newPixelData = [NSData dataWithBytes:pixelBytes length:[pixelData length]];
    //UIImage* newImage = [UIImage imageWithData:newPixelData]; 

    return originalImage;    
}

Ответы [ 3 ]

5 голосов
/ 30 августа 2009

Не вызывайте [pixelData length] в цикле. Компилятор не может знать, что результат этого сообщения является константой, поэтому он вместо этого вызовет метод.

4 голосов
/ 30 августа 2009

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

0 голосов
/ 22 августа 2013

Основная проблема с вашим кодом состоит в том, что вы рассматриваете пиксели как 4-байтовые элементы. В качестве первого шага вам нужно прочитать блок из 4 байтов как одно слово. Используйте тип uint32_t и затем читайте 1 слово за раз в регистр. Это приводит к уменьшению количества операций чтения из памяти в 4 раза, и каждый пиксель сохраняется в 1 32-битном регистре. Каждое слово содержит RGBA, причем каждый компонент занимает 8 бит 32-битного слова. Затем вам нужно использовать операции сдвига битов для управления компонентами. Вот запись в блоге, которая показывает, как это сделать с пикселями pixel_binary_layout в собственном формате BGRA для iOS. Что бы ни делала ваша пиксельная логика, вам нужно будет записать результаты, а затем проверить эти результаты, чтобы убедиться, что все работает как положено. Чтение и запись целых слов на микросхеме ARM намного быстрее, чем 4-кратное число чтений байтов, поэтому вы должны увидеть значительное улучшение.

...