Post Lists

2019년 1월 8일 화요일

DirectX Tutorial Lesson 5: The Real-Time Message Loop

http://www.directxtutorial.com/Lesson.aspx?lessonid=11-1-5

Lesson Overview
이 강의에서, 우리는 단일 함수, PeekMessage()를 다룰 것이고, 이 함수가 그것의 evil twin인 GetMessage()와 어떻게 다른지를 다룰 것이다.

실제로, GetMessage()에는 잘못이 없다. 그것이 작동하는 방법은 게임에 그리고 그것들의 지속적인 활동에 장관의 결과를 갖지 않는다. 우리는 이것이 어떻게 되어있는지, 그리고 PeekMessage()가 어떻게 솔루션인지를 다룰 것이다.

The Structure of the GetMessage() Loop
이전 강의에서, 우리는 GetMessage()함수를 사용하여, 간단한 윈도우즈 어플리케이션을 구성했다. 우리는 GetMessage()와 모든 보내진 윈도우 메세지를 처리했던 loop를 만들기 위해 다른 함수들을 사요했다. 그러나, 우리가 그 당시에 이야기 하지 않았던 부분이 있다.

다음의 다이어글매은 우리가 썼던 그 이벤트 loop가 어떻게 작동하는지를 보여준다:

우리가 그 윈도우를 만드록나면, 우리는 event loop에 들어간다. 거기에서 우리는 GetMessage() 함수를 본다. GetMessage()함수는 한 메세지를 기다리고, 하나를 받자마자, 그것을 다음 단계인 TranslateMessage()로 보낸다. 이것은 완벽히 윈도우즈 프로그래밍에 논리적이다. 왜냐하면 일반적으로 말해서 윈도우 프로그램들 예를들어 Word는 너가 움직일 때 까지 가만히 있고 아무것도 하지 않는 경향이 있기 때문이다.

그러나, 이것은 우리에게 작동하지 않는다. 이것이 기다리는 것이 발생하는 동안, 우리는 30에서 60개의 완전히 렌더링되는 3D images를 초당 만들어야하고, 그것들을 어떤 지연도 없이 스크린에 넣어야 할 필요가 있다. 그래서 우리는 오히려 교차 문제가 있따. 왜나하면 윈도우즈가 어떤 메세지를 보낸다면, 그것은 명백히 초당 그것들의 30장을 보내지 않을 것이다.

A New Function, PeekMessage()
이 딜레마를 해결하기 위해 우리가 할 것은 우리의 현재 GetMessage() 함수를 새로운 함수 PeekMessage()로 바꾸는 것이다. 이 함수는 본질적으로 같은 것을 하지만, 한 가지 중요한 차이점이 있다: 그것은 어떤 것도 기다리지 않는다. PeekMessage()는 메세지 큐를 보고, 어떤 메세지가 기다리고 있는지를 본다. 만약 없다면, 그 프로그램은 계속될 것이고, 우리가 필요한 것을 하게 해줄것이다.

우리가 더 가기전에, PeekMessage()를 봐보자. 여기에 그것의 프로토타입이 있다.

BOOL PeekMessage(LPMSG, lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);

처음에서 네 번째 파라미터들은 너에게 친숙할 것이다. 그것들은 GetMessage()와 동일하다. 그러나 5 번째 wRemoveMsg는 새로운 것이다.

그것이 하는 것은 이벤트 큐에서 가져와진 메세지가 이벤트큐에 머물러야 할지 나가야 할지를 가리킨다. 우리는 PM_REMOVE or RENOREMOVE 둘 중 하나를 넣을 수 있다. 첫 번째 것은 메세지가 읽혀질 때 큐에서 메세지를 가져온다. 바념ㄴ에 두 번째 것은 나중에 가져오기 위해 그 메세지를 남겨둔다. 우리는 PM_REMOVE를 여기에서 사용할 것이고, 상황을 간단하게 할 것이다.

그래서 우리는 어떻게 이것을 윌의 프로그램에 구현하는가? 다음이 우리가 만든 마지막 프로그램인데, PeekMessage()를 사용하여 변경되었다.

나머지 생략!

댓글 없음:

댓글 쓰기