본문 바로가기

Study Memos/Windows Programming

Direct2D (Section 43)

참고> blog.naver.com/tipsware/221125856649

 

1.Direct2D: GDI를 사용하는 것보다 좀 더 좋은 품질의 그림을 그릴 수 있는 기술
-> GDI+ 처럼 고해상도 그래픽과 'AntiAlias' 특성을 기본으로 사용 가능
-> 그래픽 장치의 그리기 가속 기능이나 그래픽 카드가 제공하는 여러 가지 특성을 직접 사용 가능하기 때문에
그래픽 출력 속도는 향상시키면서 CPU의 사용률은 오리혀 낮출 수 있음.
-> 이와 더불어, GDI+와 달리 원격으로 접속한 시스템 또는 가상 머신에서 동작하는 프로그램에서도 그대로 사용 가능하기 때문에 GDI+에서 문제가 되는 상황을 많이 해결할 수 있음.

2. CoInitializeEx 함수: Direct2D는 COM(Component Object Model)으로 만들어져 있기 때문에 프로그램에서 COM 라이브러리를 사용하기 위해서는 CoInitializeEx 함수를 호출해야 함.
-> 이 함수는 한 번만 호출하면 되기 때문에 WinMain() 함수의 시작 부분에 추가하면 됨
-> 프로그램이 종료될 때 CoUninitialize() 함수를 호출해야 함. (WinMain 함수의 마지막 부분에 추가하면 됨)

3. Direct2D 라이브러리도 선택적으로 사용하는 라이브러리이기 때문에 헤더 파일과 라이브러리 파일을 소스에 포함해야 함.

ex) #include <d2d1.h>

     #pragma comment(lib, "D2D1.lib")

 

4. Direct2D의 네임스페이스를 using 문으로 추가 가능.
ex) using namespace D2D1;

5. Direct2D를 사용하려면 최소 두 가지 이상의 객체를 생성해서 사용해야 함.
   다른 객체를 생성하기 위한 객체인 Factory 객체와 화면에 그림을 그릴 때 사용하는 Render Target 객체는 한번 만들어 놓고 계속 사용하는 것이 좋음.

6. Factory 객체는 윈도우의 생성과는 상관 없기 때문에 CoInitializeEx 함수를 호출한 후에 바로 호출하면 됨.
-> 프로그램이 종료될 때 CoUninitialize() 함수 바로 앞에서 Factory 객체의 Release() 함수를 호출하면 Factory 객체가 정리됨.

7. Render Target 객체는 그림을 그릴 대상 윈도우가 생성되어야지 생성할 수 있음.
-> WM_CREATE 메시지에서 Render Target 객체를 생성함. 
    윈도우의 클라이언트 영역 전체에 그림을 그리려면 클라이언트 영역의 좌표를 얻어서 Render Target 객체를 생성해야 함.
-> WM_DESTROY 메시지에서 Render Target 객체를 정리하면 됨.

8. Factory 객체와 Render Target 객체를 생성하고 나면 이제 윈도우의 DC를 얻지 않고서도 클라이언트 영역에 그림을 그릴 수 있음.

9.Reder Target 객체로 바로 BeginDraw 함수를 호출하면 배경이 검은색이므로, Clear() 함수를 호출하여 자신이 원하는 색으로 깨끗하게 배경을 채우고 시작하는 게 좋음.
-> 그림 그리는 코드가 완료되면 EndDraw) 함수를 호출하여 마무리함.

10. Render Target 객체는 BeginDraw 함수와 EndDraw 함수 사이에 사용된 그리기 작업을 내부 메모리에 그렸다가 EndDraw 함수가 호출되는 시점에 화면에 출력하기 때문에 Memory DC 같은 개념을 사용하지 않더라도 깜빡거림 현상이 발생하지 않음.

11. Direct2D 이슈: 화면을 지속적으로 캡처해서 시간별로 이미지 파일로 저장하는 작업을 Direct2D로 구현하는 경우, 이 컴퓨터에 원격으로 사용자가 접속했다가 접속을 해제하는 순간에 Render Target이 동작을 멈추는 현상 발생. WIC 기술을 사용하면 이를 해결할 수 있지만, 속도가 많이 느려짐.

'Study Memos > Windows Programming' 카테고리의 다른 글

Win32 개발 팁  (0) 2020.10.13
Direct2D로 그림 파일을 읽어 출력하기 (Section 44)  (0) 2020.10.12
GDI+ (Section 42)  (0) 2020.10.12
Timer (Section 41)  (0) 2020.10.12
SetDCPenBrush 함수 (Section 39)  (0) 2020.10.12