반응형

비트맵에 렌더링을 할 때 이전에 그린 부분을 지워주고 다시 그리기 위해 Clear란 함수를 만든다.

일반적으로 게임을 만들때는 화면에 Clear해주는 배경색은 보이지 않는다.

하지만 Dx에서도 배경색을 설정하는 부분은 있으니 따라서 만들겠다.

일단 간단하게 생각해 볼 수 있는 것은 비트맵 사이즈만큼 루프를 돌면서 각각 픽셀을 원하는 색으로 칠해주는 것이다.

for (int y = 0; y < height_; ++y)
{
    for (int x = 0;x < width_; ++x)
    {
          //SetPixel(x, y, color);
          bits_[y * width_ + x] = color;
     }
 }

매 프레임마다 이런식으로 처리하게 되면 매우 느려진다. 처음에 테스트 삼아 이런식으로 구현해 봤는데

아무것도 안 그리고 Clear() 만 하는데도 FPS가 어마어마하게 떨어졌었다.

배열을 빨리 초기화해 주는 방법으로는 메모리 함수를 이용하는 것이 좋다.

memset()이나 memcpy()와 같은 함수들 말이다.

기존에 만들어진 memset()의 경우에는 1바이트 단위로 처리가 되기 때문에 현재 4바이트를 사용하는 비트맵을 초기화는

하지 못한다. (대신 검은색은 모든 바이트가 0이므로 가능하다.)

g-matrix소스를 참고 하니 위에 한줄을 갱신하고 각 줄마다 memcpy()를 이용하여 복사하는 구문이 있어서 사용해 봤는데

많은 속도 개선이 있었다.

for (int x = 0; x < width_ ; ++x)
{
     bits_[x] = color;
}

for (int y = 1; y < height_ ; ++y)
{
    memcpy(&(bits_[y * width_]), &(bits_[0]), sizeof(DWORD) * width_);
}

개인적인 생각으로는 어셈에 익숙해 지면 4바이트를 복사하는 memset() 함수를 만들 수 있을 것 같다.

일단 이 Clear() 함수를 사용하고 나중에 수정할 수 있으면 수정하겠다.

반응형
Posted by msparkms
,