태그 : Tut01_CreateDevice
2008/04/03 목요일. 프로그램의 흐름을 잡아라!
설명하고자 하는 예제 코드는 Microsoft DirectX SDK (March 2008)이하 제공되는 C++ Tutorial Code입니다.
예제 코드 경로
<<C:\Program Files\Microsoft DirectX SDK (March 2008)\Samples\C++\Direct3D\Tutorials\Tut01_CreateDevice>>
프로그램의 흐름을 잡아라!
Code를 이해하기 위해선 가장 중요한 것이 그 코드의 흐름을 파악하는 것이다.
즉! Entry point가 어디이며 초기에 어떠한 특별한 설정 또는 input을 가지고 어떤 연산을 하는지를 알아야 한다. 그리고 그에 대한 output은 무엇인지를 파악해야 한다.
DirectX9.0 불라 불라 불라 버전은 MS(Microsoft)사의 Windows계열에서 구동된다.
또한 지원되는 몇몇 함수들이 마이크로프로세서의 도움 없이도 그리픽 가속기 상에서 수행될 수 있도록 하기 위해 설계되었다. 그래픽 가속기 제작자들은 DirectX를 위한 특별한 드라이버를 제공한다.
아무튼, 그렇다 치고! 코드로 프로그램의 흐름을 잡아보도록하자!
첫째. application의 entry point는 어디인가?
소스 코드가 작성되고 컴파일을 통해 기계어(object file)가 되고 그것은 linkage editor를 통해 start-up code와 또 다른 object file을 링크하여 load module인 실행 프로그램 파일을 만들게 된다. 이 실행 프로그램 파일은 Memory(RAM)에 적재 되어 주소 바인딩이 이루어 져야만 실제로 CPU 연산이 가능하게 된다.(이에 대한 자세한 내용은 트랙백을 참조하라.)
CPU는 이렇게 RAM의 코드 영역의 명령어를 읽어 들여 프로그램을 실행하게 되는데!
Tut01_CreateDevice 예제의 최초 진입지점(entry point)은
[Line num. 144]
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{....}
이 코드는 WinAPI를 학습한 경험이 있는 사람에겐 매우 친숙하게 보일 것이다. 콘솔에서 코딩을 할때는 main()이 진입점 이였듯이 Windows환경에서는 WinMain()이 진입점이 된다. wWinMain()은 유니코드 지원 환경임을 의미하는 것이다.
둘째. Win32의 동작 원리를 파악하자!
[Line num. 147~155, 173]는 window class(struct)를 설정하고 메모리에 할당하고 Window를 생성하기 위한 코드이다. [173]은 할당된 메모리를 해제하는 함수이다.
그리고 [Line num. 161~162]는 생성된 Window의 보여지는 상태를 설정하고 화면에 그리는 작업을 한다.
[Line num. 164~170]은 메세지를 처리하는 메시지 루프이다.
각각의 함수와 자료형에 관한 내용은 MSDN과 WinApi를 참고한다.
셋째. 메시지 처리 과정을 파악하자!
==============================================
164 | // Enter the message loop
165 | MSG msg;
166 | while( GetMessage( &msg, NULL, 0, 0 ) )
167 | {
168 | TranslateMessage( &msg );
169 | DispatchMessage( &msg );
170 | }
==============================================
윈도우 운영체제가 감지한 이벤트를 프로그램의 메시지 큐에 메시지를 넣어주게 되는데, 함수 GetMessage()는 이 메시지 큐의 메시지를 읽어들여 첫번째 매개변수인 msg(MSG 구조체)에 저장한다. 이 함 수는 WM_QUIT의 윈도우 메시지를 읽어들일 경우 False를 리턴하며 루프를 빠져나오게 된다.
TranslateMessage()함수는 키보드 입력 메시지를 가공하는 것으로 WM_KEYDOWN과 WM_KEYUP의 연속 발생으로 WM_CHAR를 만드는 역할을 한다.
DispatchMessage()함수는 위의 과정을 거친 메시지를 메시지 처리 함수인 MsgProc()으로 보내게 된다.
==============================================
119 | LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
120 | {
121 | switch( msg )
122 | {
123 | case WM_DESTROY:
124 | Cleanup();
125 | PostQuitMessage( 0 );
126 | return 0;
127 |
128 | case WM_PAINT:
129 | Render();
130 | ValidateRect( hWnd, NULL );
131 | return 0;
132 | }
133 |
134 | return DefWindowProc( hWnd, msg, wParam, lParam );
135 | }
==============================================
hWnd는 메시지를 받을 윈도우 핸들을 msg는 윈도우 메시지를 wParam과 lParam은 전달된 메시지의 부가적 정보를 나타낸다.
즉, mag가 WM_PAINT(화면을 다시 그려야 할 경우 발생되는 메시지)라면 [Line num. 128]의 내용을 실행하게 되는 것이다.

# by | 2008/04/04 00:00 | ▶▷DirectX◁◀ | 트랙백(2) | 덧글(2)
◀ 이전 페이지 다음 페이지 ▶