참고. NDS 속도에 대한 몇가지 테스트

 원문 : http://kkamagui.springnote.com/pages/503175

 

들어가기 전에...

 

0.시작하면서...

 NDS의 실제 속도는 얼마나 될까? 클럭으로 따지자면 둘다 100MHz가 안되니 그리 빠르다고는 할 수 없다. 하지만 이 수치만 가지고는 뭔가 와닿지가 않는다.

 우리가 쉽게 느낄 수 있는 것? 화면 그리는데 몇 ms 걸리고, 얼마의 크기의 메모리를 복사하는데 몇 ms가 걸리고 하는 말이 더 와닿지 않는가? 지금부터 프로파일러를 사용해서 NDS의 속도에 대한 몇가지를 테스트 해보자. 프로파일러에 대한 내용은 22 타이머(Timer)를 이용한 프로파일러(Profiler) 만들기 에서 찾을 수 있다.

 

1.메모리 복사 속도

 메모리 속도 테스트는 RGB555 포맷을 사용하는 프레임 버퍼(Frame Buffer)모드의 화면 전체를 복사하는 것을 테스트 했다. 참고로 스크린의 크기는 256 * 192 이므로 총 메모리양은 256 * 192 * 2 = 98304 Byte이다.

 여기서 사용된 코드는 모두 GCC의 최적화 옵션 중 최고인 -O2 옵션으로 컴파일 되고 링크되었다.

 

1.1 메인 메모리(Main Memory) -> 메인 메모리(Main Memory)

1.1.1 memcpy 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
        memcpy( SUB_FRAMEBUFFER, MAIN_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH * 2 );
  2.     memcpy( MAIN_FRAMEBUFFER, SUB_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH *  2 );
    }

  테스트 결과는 아래와 같다.

  • NDS : 17 ~ 18 ms,한 화면을 복사하는데 8.5 ~ 9 ms
  • NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms

 

1.1.2 for 루프 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
     int i;
     
     DWORD* pdwDst;
     DWORD* pdwSrc;
     
     pdwDst = ( DWORD* ) SUB_FRAMEBUFFER;
     pdwSrc = ( DWORD* ) MAIN_FRAMEBUFFER;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }
         
     pdwDst = ( DWORD* ) MAIN_FRAMEBUFFER;
     pdwSrc = ( DWORD* ) SUB_FRAMEBUFFER;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }
    }

  테스트 결과는 아래와 같다.

  • NDS : 17 ~ 18 ms,한 화면을 복사하는데 8.5 ~ 9 ms
  • NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms

 

1.1.3 고속 메모리 전송 함수 사용(자작)

 ARM 모드의 12개 레지스터를 사용해서 블럭 전송을 하는 소스코드인데, 자세한 것은 02 NDS 홈브루(Homebrew) - NDS 윈도우 시스템(Windows System)의 내용을 참고하자. 시간은 4 ~ 5 ms 정도(앞서 테스트의 반) 나온다.

 

1.2 메인 메모리(Main Memory) -> 비디오 메모리(Video Memory)

1.2.1 memcpy 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
        memcpy( LCD_MAIN_ADDR, MAIN_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );
       
        memcpy( LCD_SUB_ADDR, SUB_FRAMEBUFFER, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );
    }

 테스트 결과는 아래와 같다.

  • NDS : 14 ~ 15 ms,한 화면을 복사하는데 7 ~ 7.5 ms
  • NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms

 

1.2.2 For 루프 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
     int i;
     
     DWORD* pdwDst;
     DWORD* pdwSrc;
     
     pdwDst = ( DWORD* ) LCD_MAIN_ADDR;
     pdwSrc = ( DWORD* ) MAIN_FRAMEBUFFER;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }     
       
     pdwDst = ( DWORD* ) LCD_SUB_ADDR;
     pdwSrc = ( DWORD* ) SUB_FRAMEBUFFER;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }
    }

 테스트 결과는 아래와 같다.

  • NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
  • NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms

 

1.2.3 고속 메모리 함수 사용(자작)

 여기 추가하기...

 

1.3 비디오 메모리(Video Memory) -> 메인 메모리(Main Memory)

1.3.1 memcpy 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
        memcpy( MAIN_FRAMEBUFFER, LCD_MAIN_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );
       
        memcpy( SUB_FRAMEBUFFER, LCD_SUB_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );

 테스트 결과는 아래와 같다.

  • NDS : 13 ~ 14 ms,한 화면을 복사하는데 6.5 ~ 7 ms
  • NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms

 

1.3.2 For 루프 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
     int i;
     
     DWORD* pdwDst;
     DWORD* pdwSrc;
     
     pdwDst = ( DWORD* ) MAIN_FRAMEBUFFER;
     pdwSrc = ( DWORD* ) LCD_MAIN_ADDR;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }     
       
     pdwDst = ( DWORD* ) SUB_FRAMEBUFFER;
     pdwSrc = ( DWORD* ) LCD_SUB_ADDR;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }
    }

 테스트 결과는 아래와 같다.

  • NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
  • NDS Emulator(iDeaS) : 29 ~ 30 ms,한 화면을 복사하는데 14.5 ~ 15 ms

 

1.3.3 고속 메모리 전송 함수(자작)

 여기 추가하기...

 

1.4 비디오 메모리(Video Memory) -> 비디오 메모리(Video Memory)

1.4.1 memcpy 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
        memcpy( LCD_SUB_ADDR, LCD_MAIN_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );
       
        memcpy( LCD_MAIN_ADDR, LCD_SUB_ADDR, SCREEN_HEIGHT * SCREEN_WIDTH *
                2 );
    }

 테스트 결과는 아래와 같다.

  • NDS : 16 ~ 17 ms,한 화면을 복사하는데 8 ~ 8.5 ms
  • NDS Emulator(iDeaS) : 23 ~ 24 ms,한 화면을 복사하는데 11.5 ~ 12 ms

 

1.4.2 For 루프 사용

 아래는 프로파일링 테스트에 사용된 함수이다.

  1. /**
        FrameBuffer의 내용을 LCD에 덤프한다.
    */
    void CWindowManager::DumpFrameBufferToScreen( void )
    {
     int i;
     
     DWORD* pdwDst;
     DWORD* pdwSrc;
     
     pdwDst = ( DWORD* ) LCD_SUB_ADDR;
     pdwSrc = ( DWORD* ) LCD_MAIN_ADDR;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }     
       
     pdwDst = ( DWORD* ) LCD_MAIN_ADDR;
     pdwSrc = ( DWORD* ) LCD_SUB_ADDR;
     
     for( i = SCREEN_HEIGHT * SCREEN_WIDTH / 2 ; i > 0 ; i-- )
     {
      *pdwDst = *pdwSrc;
      pdwDst++;
      pdwSrc++;
     }
    }

 테스트 결과는 아래와 같다.

  • NDS : 19 ~ 20 ms,한 화면을 복사하는데 9.5 ~ 10 ms
  • NDS Emulator(iDeaS) : 39 ~ 40 ms,한 화면을 복사하는데 19.5 ~ 20 ms

 

1.4.3 고속 메모리 전송 함수(자작)

 ARM 모드의 12개 레지스터를 사용해서 블럭 전송을 하는 소스코드인데, 자세한 것은 02 NDS 홈브루(Homebrew) - NDS 윈도우 시스템(Windows System)의 내용을 참고하자. 시간은 4 ~ 5 ms 정도(앞서 테스트의 반) 나온다.

 

1.5 메모리 복사에 대한 결론

  • 비디오 메모리 -> 비디오 메모리를 제외하고는 모두 거의 비슷
  • 블럭 전송 시간 < memcpy 시간 <= for 루프 시간
  • 에뮬레이터의 속도는 믿을 것이 못됨
  • 블럭 전송이 가장 빠름

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts