mfc과제하다 버퍼링과 버벅임에 대해서 질문올립니다.

battlexnwl의 이미지

mfc과제로 시계를 만들다가 시간이 좀 남아서 내친김에
화살표 키로 시계를 공 튀기듯이 움직이게 만들었습니다.

그래서 조금 더 사실적인 부드러운 움직임을 보고 싶어서
설정으로 SetTimer(2, 10, NULL);
선언하고 가지고 놀고 있었습니다.
물론 더블버퍼링 쓰구요.

그런데 아무리 봐도 언뜻 부드럽게 움직이는 듯 하면서도 한 0.2초 주기로 버벅거리길래,
Invalidate(0);인자값을 1로 수정해서 확인해 봤습니다.
제 눈으로 봤을때 이전 버벅임의 주기가 깜빡이는 주기와 똑같네요.

OnPaint함수를 다시 호출하니, 그 함수가 무거운가보다 해서
어느정도 수정은 했으나 OnPaint 내부에서 사용하는 함수들에 대해서는 더이상 최적화가 어렵네요.
그렇다면 어떻게 하면 자연스럽게 움직일수 있나요?

shint의 이미지


WIN API 완전 정복\ApiPrj\12장=그리기\WmPaint 를 보면.
 
InvalidateRect()로 일부 영역을 갱신해주고. UpdateWindow()를 호출해 줍니다.
화면의 갱신에는 몇가지 방법이 있는데요. 지워진 영역'을 그려준다. 입니다.
 
지워진 영역'을 얻으려면. OnEraseBk()와 같은곳에서 지워진 만큼의 영역'을 얻은후 (이것이 맞는지는 저도 기억이 가물가물해서. 확인해봐야 합니다.)
InvalidateRect(TRUE)로 영역 만큼의 화면을 지워주고. 다시 그려주거나.    - 깜빡 입니다.
InvalidateRect(FALSE)를 사용해서. 무조건. 그려줍니다.                   - 깜빡이지 않습니다.
 
1. 지워진 영역 얻기
2. 메모리 DC에 그려주기
- 화면에 보이기 전에 여러장의 스프라이트(연속된 이미지)나 마스크(투명등의 효과).를 한장의 이미지에 그리는 더블버퍼링'을 이야기 합니다.
3. 마지막에는 메모리 DC를 메인 DC에 그려줍니다.
 
갱신'보다 다시 그려주는것이. 효율적인 경우도 있습니다.
 
자세한것은 서적'을 참고해 보세요. ㅇ_ㅇ;;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

battlexnwl의 이미지

갱신(?)할 화면만 따로 받아서 memDC에 다시 그려주는 방법이군요. 감사합니다. :)