PeekMessage
게임을 만들때 중요한것 중 확인하고 넘어가야 할 부분은 메세지 루프 입니다.
일반적으로 message를 가져오는 GetMessage() 함수가 있습니다.
이 함수는 메세지 큐에서 message를 가져와 message구조체에 복사하고 message 큐에 복사한다.
message가 없을때는 새로운 message가 들어올 때까지 리턴을 하지 않습니다.
메세지가 들어오기 전까지는 놀고 있게 되는건데,
이 놀고 있는 시간을 dead time(데드 타임) 이라고 합니다. (MicroSoft 특허가 있다고 하더라..)
메세지가 없는 시간 또는 구간에 우리가 다른 작업을 할 수 있다면, 메세지 처리 시간과 별개로
다른 작업에 영향을 주지 않고 실행해야할 것들을 처리할 수 있겠습니다. 만,
GetMessage()의 특성상 메세지가 들어오지 않을 시에는 리턴되는 값이 없기 때문에,
dead time을 활용 할 수가 없습니다.
이 dead time을 사용하기 위해서 메세지 루프에 PeekMessage()를 사용하게 됩니다.
PeekMessage()는 일반적으로 메세지를 처리하는 부분은 GetMessage() 동일 합니다.
메세지가 있다면 true를 반환 하고, 메세지가 없다면 false를 반환 하게 되는데,
while( true )
{
if(PeekMessage(&msg ......)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
else
{
MainGame.Progress();
MainGame.Render();
}
}
위처럼 PeekMessage()가 false를 반환 할 경우에 즉 메세지가 없을때 (dead time)
MainGame.Progress(); 와 MainGame.Render(); 를 실행하게 됩니다.
PeekMessage()를 사용한다면 dead time을 위처럼 사용 할 수 있겠습니다.
마지막으로 PeekMessage()의 마지막 인자로 PM_REMOVE 를 사용하면, 현재 처리한 메세지와 같은 메세지가 들어온다면 그 메세지를 삭제합니다. 반대로 PM_NOREMOVE는 메세지를 제거하지 않고 리턴 합니다.
-> 메세지가 있는지 확인을 하고 없다면 false를 반환 합니다.
-> 리턴값이 TRUE이면, 메세지가 있고, FALSE면 메세지가 없다.
일반적으로 게임을 프로그래밍 해야 한다면 PeekMessage()를 사용해야 겠습니다.
message가 없을때 Game이 멈춰 있다면 안되겠지요.
[출처] API에서 가장 중요한 메세지루프! ( GetMessage, PeekMessage ) | 작성자 AhHee
'Computer > C, CPP, MFC' 카테고리의 다른 글
ReadFile() (0) | 2015.12.04 |
---|---|
SetFilePointer() (0) | 2015.12.04 |
프로그램 종료 (0) | 2015.10.13 |
하위폴더까지 전체 복사하기 (0) | 2015.10.02 |
윈도우 버전 알아보기 (0) | 2015.10.02 |
Windows Styles (0) | 2015.06.15 |
timeSetEvent 와 친구들 (0) | 2015.06.02 |
Printf 함수에 대해서 알아보자 (0) | 2011.07.13 |