2011-07-27 3 views
0

두 개의 픽셀 스트림이 있으며 기본적으로 최종 결과 그림을 위해 사용자 정의 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... 
+0

평소 흐름은 어느 정도입니까? – Cyprian

+0

if ... else ... 부분이 없으면 얼마나 빠릅니까? – Eiko

+0

또 다른 몇 가지 질문 : Pic1의 색상 일치 가능성 및 Pic2의 가능성은 어느 정도입니까? 확인하는 색상에 공통점이 있습니까? – Eiko

답변

1

당신이 할 수있는 한 가지는 각 스트림의 세 값을 하나의 큰 변수로 결합하는 것입니다. 이렇게하면 세 가지 모두를 한 번에 비교할 수 있으므로 코드에서 3 분의 1만큼의 비교가 발생합니다.

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

픽셀 버퍼를 직접 걷지 마십시오. 너무 느려질 수 있습니다. CoreImage에서 사용자 정의 필터를 사용하여 이런 종류의 작업을 수행하십시오.

+0

코드 예제가 있습니까? 나는 당신과 완전히 동의하면서 이것을 위해 일찍 주요 검색을했습니다! 이것은 최상의 해결책이 될 것입니다. 나는 특정 색상을 추출하거나 특정 색상을 마스크 할 수있는 필터링 방법을 찾는데 어려움을 겪었다. – capikaw

관련 문제