2009-07-20 8 views
1

이 선 그리기 루틴을 최적화하는 방법은 무엇입니까? memcpy가 더 빨리 작동할까요?선 그리기 루틴

void ScreenDriver::HorizontalLine(int wXStart, int wXEnd, int wYPos, 
    COLORVAL Color, int wWidth) 
{ 
    int iLen = wXEnd - wXStart + 1; 

    if (iLen <= 0) 
    { 
     return; 
    } 
    while(wWidth-- > 0) 
    { 
     COLORVAL *Put = mpScanPointers[wYPos] + wXStart; 
     int iLen1 = iLen; 

     while(iLen1--) 
     { 
      *Put++ = Color; 
     } 
     wYPos++; 
    } 
} 
+0

몇 가지 추가 정보 : - COLORVAL -> uint16_t - 플랫폼 -> IMX31 ARM – tommyk

답변

4

"memcpy"대신 "memset"이라고 말하고 싶습니다. 코드의이 비트를 교체 :

while (iLen--) 
{ 
    *Put++ = Color; 
} 

memset(Put, Color, iLen); 

로하는 것은 빠를 수 있지만, 너무 많은 목표 CPU, 메모리 아키텍처에 따라 달라 iLen의 전형적인 값이 발생 할 수있다. 큰 우승은 아니지만, 시간이 있다면 그 종류의 운동이 실제로 최적화를 이해하는 유일한 방법이기 때문에 대안을 측정하는 것이 좋습니다.

물론이 memset() 사용은 COLORVAL이 문자 크기 인 경우에만 작동합니다.

1

아니요. memcpy는 메모리를 복사하고, 그것은 읽기 및 쓰기이며 읽기는 필요하지 않습니다. memset은 단지 쓰기 만하므로 바이트 만 기록하므로 COLORVAL도 바이트가 아닌 한 어느 것도 작동하지 않습니다. 아니요, 그대로 두십시오. 컴파일러는 상당히 좋은 코드를 생성해야합니다. 아마도 메모리 대역폭에 의해 제한된다는 것을 잊지 마십시오.

0

필자는 개인적인 경험을 통해 memcpy가 직접 포인터 액세스보다 약간 빠르다는 것을 알았지 만, 대개는 근본적인 최적화가 아닙니다.

0

가장 빠른 방법으로 가로선을 그리거나, 값이있는 배열을 채우거나, 어셈블리에서 stosb, stosw, stosd 명령어를 사용하는 것이 가장 좋습니다. memset은 stosb을 사용하도록 최적화되어 있습니다. DWORD 값을 사용하려면 아래의 하나의 선을 그리는 것처럼 우리는

__asm { 
     cld 
     mov eax, color 
     mov ecx, screen_width 
     mov edi, video_buffer 
     rep stosd 
} 

, 코드를 작성할 수 있습니다하지만 당신의 내면의 while 루프 어쨌든 stosd를 사용하는 컴파일러에 의해 최적화 될 것이라고 확신 해요.

1

다른 작업을하기 전에 가장 적합한 방법은 사용 가능한 저수준 프로파일 링 도구를 사용하는 것입니다. 적어도 상당한 테스트 케이스 또는 3에 대한 전반적인 타이밍을 얻습니다. 기준 측정이 없으면 어둠 속에서 촬영 중입니다. (나는 다른 사람과 같은이의 유죄 해요, 알고 있어야합니다!)

나는 그것이 픽셀 당 오버 헤드의 공정한 조금을 가지고 같은 코드를 보이는 점에 유의 말했다,

  1. memset 함수를 () 호출은 승리가 될 수 있습니다 (COLORVAL이 sizeof (char)이면).

  2. 또는, 도움이 될 수 있습니다 루프를 줄이기 -이 입력 한 데이터에 크게 의존, 기계 구조 등

  3. 당신의 iLen 값은 합리적으로 각 iLen 값에 대해 사용자 정의 함수를 작성하는 것이 좋습니다 경계 경우 그 (스위치의 처음 몇 가지 작은 경우를 인라인으로) 완전히 전개되고 함수 포인터 배열을 통해 더 큰 케이스를 호출하십시오.

  4. 가장 빠른 옵션은 대개 조립에 의지하는 것입니다.

0

내부 루프를 풀어 볼 수도 있지만 실제로는 수평선 가까이있는 선에서만 문제가됩니다.

수평선에 가깝지 않은 라인의 경우 스캔 포인터 테이블을 설정하는 데 더 많은 시간을 할애 할 수 있습니다.

색상, 너비, 선 스타일 및 최종 스타일뿐만 아니라 XOR 및 앨리어싱과 같은 드로잉 모드는 물론보다 현실적인 상황에 대해 내가 본 것처럼 보이는 방식은

입니다.
  1. 각 "라인은"정말 다각형 채우기,있는 (알고리즘이 무엇인지 사실이다) 매우 빠른 알고리즘이있다, 그리고/또는

  2. 특수 목적 기계 언어 루틴 옵션 특정 루틴을 가질 수있는 옵션이 너무 많고 알고리즘을 원하지 않기 때문에 (스택에 저장되어) 즉석에서 생성됩니다 옵션별로 무엇을 픽셀 단위로 지속적으로 질문합니다.