Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- API
- range
- mutex
- package
- File
- FOR
- windows
- tcp
- JavaScript
- go언어
- bitcoin
- 영화
- go
- Golang
- window
- Linux
- json
- write
- C
- Sync
- Python
- Close
- http
- install
- 리뷰
- Callback
- 책
- GO 언어
- channel
- c++
Archives
- Today
- Total
Code Habit
WIN API) 더블 버퍼링 본문
화면에 그림을 그리는 것은 생각보다 부하가 심하다. 만약 화면 DC를 가져와 직접 그린다면 그림을 그리는 도중 무수한 깜박임이 발생한다. 이를 위해 우리는 더블 버퍼링을 활용할 수 있다. 더블 버퍼링이란 메모리 DC를 생성해 여기에 미리 그림을 그린 후 실제 출력할 화면 DC에 고속 복사를 하는 것이다. 실제 이렇게 화면을 그릴 경우 화면 깜박임이 없어지는 것을 볼 수 있다.
아래는 더블 버퍼링을 활용한 예제이다.
GetClientRect(&rect);
HDC hdc = GetDC(hwnd); // 그림 그릴 윈도우의 DC 가져오기
HDC hMemdc = CreateCompatibleDC(hdc); // 화면dc(그릴 윈도우) 기반 메모리 DC생성
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rect.right, rect.bottom); // 비트맵 생성
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemdc, hBitmap); // 비트맵 선택
FillRect(hMemdc, &rect, GetSysColor(COLOR_BACKGROUND)); // 메모리 dc에 그리기
BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemdc, 0, 0, SRCCOPY); // 고속복사 hMemdc->hdc
SelectObject(hMemdc, hOldBitmap); // 기존 비트맵 선택
ReleaseDC(hMemdc); // 메모리 dc 해제
ReleaseDC(hdc); // 화면 dc 해제
메모리 DC를 만들고 비트맵 생성 후 메모리 DC에 설정한다. 그리고 메모리 DC에 그림을 그리고 화면 DC에 고속복사 한다.
더블 버퍼링 기법은 그래픽 기반 윈도우 어플리케이션을 만드는데 필수인 개념이며, 정말 간단한 프로그램을 만들지 않는 이상 필수로 수행해야 한다.