2011-03-14 2 views
2

여기에있는 코드는 임시입니다. 나는 클리핑 절차에 중점을 둘 것입니다. if() 문이 많이있는 것처럼 보입니다. 누군가가 이것을 조금씩 최적화하는 영리한 방법이되기를 바랍니다.C++ : 간단한 이미지 클리핑 연산 최적화 ... if() 문이 너무 많습니다.

m_nStride가 무엇인지 궁금하다면, 그 아래에있는 픽셀 (y + 1, x + 0)에 도달하기 위해 주어진 픽셀 포인터에 추가 할 요소의 수입니다. 그러나 어느 쪽이든, 그건 내 질문에 관한 중요하지 않습니다.

일반적인 생각은 좌표 left, top, width 및 height를 사용하여 이미지의 직사각형 영역 (32 비트)을 채우는 것입니다. 좌표로 인해 해당 영역이 이미지의 경계를 넘게되는 경우 오류로 해석되는 대신 이미지 내부에 맞게 영역이 잘립니다. 성능

void Image::Clear(int nLeft, int nTop, int nWidth, int nHeight, DWORD dwColor) 
{ 
    if(nWidth <= 0) return; 
    if(nHeight <= 0) return; 
    if(nLeft >= m_nWidth) return; 
    if(nTop >= m_nHeight) return; 

    if(nLeft < 0) 
    { 
     nWidth += nLeft; 
     if(nWidth <= 0) 
      return; 
     nLeft = 0; 
    } 

    if(nTop < 0) 
    { 
     nHeight += nTop; 
     if(nHeight <= 0) 
      return; 
     nTop = 0; 
    } 

    if(nLeft + nWidth > m_nWidth) 
    { 
     nWidth -= ((nLeft + nWidth) - m_nWidth); 
     if(nWidth <= 0) 
      return; 
    } 

    if(nTop + nHeight > m_nHeight) 
    { 
     nHeight -= ((nTop + nHeight) - m_nHeight); 
     if(nHeight <= 0) 
      return; 
    } 

    DWORD *p = m_pBuffer + (m_nStride * nTop) + nLeft; 
    for(int y = 0; y < nHeight; y++) 
    { 
     for(int x = 0; x < nWidth; x++) 
      p[x] = dwColor; 
     p += m_nStride; 
    } 
} 
+0

어떤 목표로 최적화 하시겠습니까? 공연? 코드 줄? 명쾌함? 대부분? – xan

+0

성능 ... 어쩌면 너무 많은 if() 문을 사용하지 않고 모든 가능성을 테스트하는 더 영리한 방법 일 것입니다. 대부분의 경우 영역을 클리핑 할 필요가 없으므로 낭비되는 코드 일뿐입니다 ...하지만 나도 마찬가지입니다. 클리핑 코드를 사용하지 않는 편이 안전합니다. – TurtleToes

답변

5

if 헤드는 사실상 루프 for 비교 제로이다. 그럼에도 불구하고, 여기 연습 문제는 수표가 적은 버전입니다. 경계를 먼저 잘라낸 다음 폭과 높이가 양수인지 확인해야합니다.

void Image::Clear(int nLeft, int nTop, int nWidth, int nHeight, DWORD dwColor) 
{ 
    if(nLeft < 0) 
    { 
     nWidth += nLeft; 
     nLeft = 0; 
    } 

    if(nTop < 0) 
    { 
     nHeight += nTop; 
     nTop = 0; 
    } 

    if(nLeft + nWidth > m_nWidth) 
    { 
     nWidth = m_nWidth - nLeft; 
    } 

    if(nTop + nHeight > m_nHeight) 
    { 
     nHeight = m_nHeight - nTop; 
    } 

    if(nWidth <= 0) return; 
    if(nHeight <= 0) return; 

    DWORD *p = m_pBuffer + (m_nStride * nTop) + nLeft; 
    for(int y = 0; y < nHeight; y++) 
    { 
     for(int x = 0; x < nWidth; x++) 
      p[x] = dwColor; 
     p += m_nStride; 
    } 
} 
+0

고마워요 ... 나는 그것을 시도 할 것입니다 ... for() 루프가 걱정되는 한, 컴파일러는 그것들을 꽤 잘 최적화합니다. 나는 모든 방식의 알고리즘과 소위 "최적화 된"어셈블리 코드 구조를 시도했는데, for 루프에서 버퍼의 기본 + 인덱스가 주어지면 MSDEV2010 최적화 코드만큼 빠르지 않았다. – TurtleToes

+0

분명히 투표 하겠지만 분명히 나는 그것을 아직 할 수 없다. .. 유감스럽게 생각한다. 나는 언젠가 돌아와 당신에게 투표 할 것이다. – TurtleToes

관련 문제