게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
Windows API 그래픽 프로그래밍
게시물ID : programmer_12266짧은주소 복사하기
작성자 : 중용자
추천 : 2
조회수 : 2885회
댓글수 : 17개
등록시간 : 2015/07/22 13:27:32
일단 Windows API로 기본적인 출력은 할 수 있다는 전제하에 설명합니다.

1. 더블 버퍼링

정확한 더블 버퍼링의 사용은 깜빡임 현상이 전무합니다.
화면 전체를 그리는 BitBlt의 속도는 1밀리세컨드도 되지 않기 때문에 인간의 눈으로 깜빡임을 볼 수가 없습니다.
보통 더블 버퍼링을 해도 깜빡이는 경우는 WM_ERASEBKGND 메세지 처리를 하지 않기 때문입니다.
WM_ERASEBKGND 메세지를 받아서 TRUE로 리턴해야 배경을 지우지 않습니다.
WM_ERASEBKGND 메세지 처리를 하지 않으면 윈도우 생성시 지정된 배경색으로 화면을 지운 후 WM_PAINT 메세지가 발생해야 그 때 Bitblt을 하기에 메세지 발생의 시간차 때문에 깜빡이는 겁니다.
WM_ERASEBKGND 메세지를 처리하지 않아도 배경색으로 화면을 지우지 않는 또다른 방법은 RegisterClassEx에서 사용하는 WNDCLASSEX구조체 hbrBackground에 NULL을 설정하면 WM_ERASEBKGND 메세지 처리 여부에 상관없이 화면을 지우지 않습니다.
설정된 배경색이 없으니 당연한거겠죠.

2. GDI

Windows API에서 화면에 출력하기 위해서는 보통 GDI 함수들을 사용합니다.
GDI+ 등도 있지만 단순한 출력에는 GDI가 가장 빠르죠.
문제는 Windwos API에서 가장 빠른 GDI 함수들도 속도가 극악으로 느리다는 겁니다.
비트맵을 출력하지 않고 화면에 점, 선, 면 등을 출력하려면 선택의 여지가 없이 SetPixelV와 FillRect를 사용하는데 화면 전체를 SetPixelV로 점으로 찍으면 1초에 몇 화면 찍지를 못합니다.
한마디로 동영상 플레이어 같은 건 GDI 만으로는 불가능 하다는 것이죠.
느린 속도 뿐만 아니라 단순한 출력방식만 지원하기 때문에 그래픽 출력을 많이 하는 앱의 경우 일반적으로 DirectX를 사용합니다.

3. Windows API 초고속 그래픽 프로그래밍

하지만 Windows API로도 초고속으로 화면에 출력하는 방법이 있습니다.
더블 버퍼링으로 비트맵을 생성한후 GDI 함수로 출력하고 메인 윈도우 화면에 복사하는 방식이 아닌 출력할 화면 크기만큼 메모리를 동적생성후 메모리에 직접 X, Y좌표를 계산하여 컬러를 입력한 후 이 메모리를 메인 윈도우 화면에 복사하는 것입니다.
SetPixel, FillRect 등의 API를 사용하는게 아닌 메모리에 데이터를 직접 입력하는 방식이기에 점하나 찍는 속도로는 이 방식보다 빠를 수 있는 방식이 없습니다.
DirectX 함수, GDI 함수들도 인자를 받으면 결국 좌표에 해당하는 메모리에 컬러을 쓰는 것으로 완료가 되는데 이 방식은 모든 과정을 건너 뛰고 직접 메모리에 데이터를 쓰기 때문이죠.

현재 제가 개발하고 있는 에뮬레이터의 화면 출력 방식으로 처음에는 FillRect를 사용해 화면을 출력했으나 화면 출력에 40 밀리세컨드 정도가 걸려 메모리 직접 입력 방식으로 바꾼후 화면 출력에 1밀리세컨드 이하의 시간만 걸립니다.
사실 Windows 이전의 PC에서는 전부 좌표 계산해서 그래픽 메모리에 직접 출력했습니다.
그것과 거의 동일한 방식으로 DirectX, GDI, OpenGL 등을 떠나 그래픽 가속기를 쓰지 않는 경우 이것보다 더 빠른 방법은 없습니다.
출처 본인
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호