Более быстрое перечисление пикселей - PullRequest
0 голосов
/ 27 июля 2011

У меня есть два потока пикселей, и мне нужно сделать специальный xor для них, чтобы получить окончательное изображение. Он работает отлично - единственная проблема в том, что симулятору требуется около 4 секунд, чтобы разобрать код. Я знаю, что должен быть способ оптимизировать эту процедуру, но после нескольких дней тестирования моих идей (безрезультатно) я прибегаю к помощи!

Вот мой код - заранее спасибо за любые предложения!

             //rawPic1Data and rawPic2Data is a stream of unsigned chars that ultimately came from a UIImage

                for (int i = 0 ; i < (bufferLength); i=i+4)
                {

                    sred = (int)(rawPic1Data[i + 0]);
                    sgreen = (int)(rawPic1Data[i + 1]);
                    sblue = (int)(rawPic1Data[i + 2]);

                    rred = (int)(rawPic2Data[i + 0]);
                    rgreen = (int)(rawPic2Data[i + 1]);
                    rblue = (int)(rawPic2Data[i + 2]);

                    fred = 0;
                    fgreen = 0;
                    fblue = 0;
                    falpha = 0;

                    if (((sred == 102) && (sgreen == 0) && (sblue == 153)) || ((rred == 102) && (rgreen == 0) && (rblue == 153)))
                    {
                        fred = 102; fgreen = 0; fblue = 153; falpha = 255;
                    }
                    else if (((sred == 153) && (sgreen == 51) && (sblue == 204)) || ((rred == 153) && (rgreen == 51) && (rblue == 204)))
                    {
                        fred = 153; fgreen = 51; fblue = 204; falpha = 255;
                    }

                     //...repeat the elseifs for another 12 colors.  (14 total)
                }

            //Use the f values for my final output... 

Ответы [ 2 ]

1 голос
/ 27 июля 2011

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

sred = (int)(rawPic1Data[i + 0]);
sgreen = (int)(rawPic1Data[i + 1]);
sblue = (int)(rawPic1Data[i + 2]);
register unsigned sval = (sred << 16) | (sgreen << 8) | (sblue);

rred = (int)(rawPic2Data[i + 0]);
rgreen = (int)(rawPic2Data[i + 1]);
rblue = (int)(rawPic2Data[i + 2]);
register unsigned rval = (rred << 16) | (rgreen << 8) | (rblue);

fred = 0;
fgreen = 0;
fblue = 0;
falpha = 0;

if(sval == ((102<<16)|(153) || rval == ((102<<16)|(153)) {
    fred = 102; fgreen = 0; fblue = 153; falpha = 255;
} else if(sval == ((153<<16)|(51<<8)|(204))) || rval = ((153<<16)|(51<<8)|(204)))) {
    fred = 153; fgreen = 51; fblue = 204; falpha = 255;
} ...

Такая оптимизация ускорила мою тестовую программу на 36,5%,всего 5 тестовых случаев.

1 голос
/ 27 июля 2011

Не обходите пиксельные буферы самостоятельно, это будет мучительно медленно.Делайте такие вещи с пользовательским фильтром в CoreImage.

...