Game Programming/Rendering

DX 9 :: 리얼타임 메시지 루프

VallistA2016. 2. 16. 13:51

DX 관련 글


기본 윈도우 생성 : 클릭

윈도우 생성 : 클릭

리얼타임 메시지 루프 : 클릭

Direct3D 시작 : 클릭




이번에는 API에서 기본적으로 처리하는 루틴에 대한 속도를 상승시켜 볼 것이다.

이러한 작업이 필요한 이유는 GetMessage는 메시지가 들어올 때에만 반응을 하기 때문에 전반적으로 게임에 안쓰이는 것도 있으며

그 것보다 유용하게 쓰일 수 있는 PeekMessage가 있기 때문이다.




GetMessage() 함수의 루프 구조


GetMessage() 함수를 저번 글을 통해 알아보았는데, GetMessage() 함수가 어떻게 구동되는지 알아야 비효율적이다 라는 것을 알 수 있기에, 

먼저 알아보려 한다. GetMessage() 함수의 루틴은 아래와 같다.



윈도우를 만든 후, GetMessage() 함수가 이벤트 루프에 들어간다.

GetMessage() 함수는 대기하다가 이벤트가 넘어오면 TranslateMessage로 보낸다. 

이 과정은 일반적인 윈도우 프로그래밍의 과정인데, 이와 같은 과정을 쓰는거는 워드등 일반적인 윈도우 프로그램에서 한정이다.


하지만 이것은 게임을 위해서 제작을 하는 DX 렌더러에는 맞지가 않는데,

이벤트를 받지 않아서 대기하는 동안 우리가 필요 한 것은 30~60 프레임의 완벽한 랜더링된 3D 이미지를 생성하고 보여주어야 하기 때문이다.

결론적으로 우리는 이러한 방법으로 사용하게 되면 초당 30~60 프레임을 전송을 할 수 없기 때문에 문제가 일어나게 된다.




새로운 함수 PeekMessage()


이 문제를 해결하기 위해 새로운 기능인 PeekMessage()를 사용을 하여 GetMessage()를 대체할 것이다.

이 기능은 본질적으로 같은 일을 하지만, 한 가지 중요한 차이점은 대기시간이 없다는 것이다.

PeekMessage()는 메시지 큐에 보이는 어떤 메시지가 대기중인지 확인한다. 대기중이지 않으면, 우리가 필요로 하는 일을 할 수 있도록 계속된다.




다음으로 넘어가기 전에 일단 PeekMessage 함수를 보도록 하자.



네 개의 매개 변수를 잘 알고 있어야 하는데, 이 매개 변수들은 아까 언급했던 GetMessage 함수의 변수와 동일하다.

하지만 다섯 번째 매개 변수는 매시지를 제거하는 새로운 기능으로 추가가 되어 있다.


다섯 번째 매개 변수가 하는 일은 이벤트 큐에서 검색 한 메시지가 이벤트 큐에 머물거나 나가야 하는지 여부를 표시하는데, 여기에 들어가는 인자로는 PM_REMOVE 또는 PM_NOREMOVE를 넣을 수 있다. 보통 PM_REMOVE 값을 사용하며 그외의 경우는 잘 쓰지 않는다.


프로그램에서 구현하는 방법은 아래와 같다.



이렇게 사용하면 고민이었던 메시지 처리 이후의 상황에 대해서 유연하게 처리를 할 수 있다.


while(TRUE)

 

 무한 루프를 만들어서 PeekMessage 가 처리하는 다른 상황에 대해서도 돌아가면서 처리할 수 있게끔 루틴을 만듭니다.


while(PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))


 더 이상 메시지를 기다리지 않고, 그때 그때마다 메시지가 있는지 처리만 하기 때문에 이러한 형식으로 처리할 수 있다.

 메시지가 없으면 false를 반환하여 아래 while 구문을 계속 실행한다.


if(msg.message == WM_QUIT)


 WM_QUIT 메시지를 전달하면 게임은 무한 루프를 종료하고 Windows로 돌아가는 소스코드이다.

 




소스코드


사용되었던 소스코드는 아래에서 확인 할 수 있다.




'Game Programming > Rendering' 카테고리의 다른 글

DX 9 :: 전체화면  (0) 2016.02.19
DX 9 :: Direct3D 시작  (0) 2016.02.17
DX 9 :: 윈도우 생성  (1) 2016.02.16
DX 9 :: 기본 윈도우 생성  (0) 2016.02.12
Direct 11 :: 'main' entry point not found  (0) 2015.03.30

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment