반응형
앞서 공부하고 정리한 내용은 무료 배포된 유튜브 "얌얌코딩"님의 강의를 시청한 후임을 밝힙니다.
얌얌코딩 (게임 개발)
어려운 게임 개발을 쉽게 배우는 방법!
www.youtube.com
기존 메세지 루프에 대한 설명 (GetMessage)
// 기본 메시지 루프입니다:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
- GetMessage 함수
- 프로세스에서 발생한 메세지를 메세지 큐에서 가져오는 함수
- 메세지 큐에 아무것도 없다면? 아무 메세지도 가져오지 않게 된다.
- 메세지 큐가 비어있던 차있던, 메세지 큐에서 빠져나오는 메세지를 받기 위한 GetMessage 함수를 무한 반복하고 있다.
- 게임 엔진에서의 메세지 루프 방식에는 어울리지 않는다.
PeekMessage
- 메세지 큐에 메세지 유무에 상관없이 함수가 리턴된다.
- 리턴 값이 true인 경우 메세지가 있고, false인 경우는 메세지가 없다라고 가르쳐준다.
while (true) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT)
break;
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else {
// 메세지가 없을 경우 여기서 처리한다.
// 게임 로직이 들어가면 된다.
}
}
정적 라이브러리 (.lib파일)
- 어떤 프로그램이 메모리에 올려질 때, 그 프로그램의 동작에 필요한 라이브러리들도 같이 메모리에 올라가게 된다.
- 장점
- 시스템 환경이 변해도 어플리케이션에 아무런 영향이 없다.
- 컴파일시 필요한 라이브러리를 적재하기 때문에 이식성이 좋다.
- 런타임시 외부를 참조할 필요가 없기 때문에 속도가 빠르다.
- 단점
- 라이브러리가 변경되면 변경된 라이브러리만 재배포하면 되는것이 아니라, 다시 컴파일해서 재배포해야 한다.
- 위와 같이 만약 서로 다른 프로그램이 동작할 때, 메모리에 다른 두 공간에 같은 라이브러리 들을 올려 놓는다면, 메모리 낭비이지 않겠는가?
- 같은 코드를 가진 프로그램이 실행할 경우가 있다면 코드가 중복될 수 있으니 그만큼 메모리를 낭비한다.
- 그래서 고안된 아이디어가 동적 라이브러리 이다.
동적 라이브러리 (.dll 파일)
- 미리 라이브러리들을 사용하든 안하든 메모리에 올려놓고, 필요한 순간에 그 주소에 접근하여 쓰는 것이다.
- 물론 속도는 정적 라이브러리가 조금 더 빠를 것이지만 큰 영향은 없다.
- 장점
- 메모리를 절약할 수 있다.
- 보다 쉽게 업그레이드 해서 배포가 가능하다.
- 서로 다른 프로그램에서 동일한 함수를 호출 가능하다.
- 프로그램 변경시 라이브러리만 재배포하면 되니까 유지 보수가 쉽다.
- 단점
- 외부의존도가 높기 때문에 이식성이 낮다.
- 공유 라이브러리를 메모리에 올려놓고, 해당 라이브러리를 찾아서 접근해야 하기 때문에 속도가 조금 느리다.
코드로 확인
- 윈도우 로직에 관한 코드 내용이 아닌 게임 로직이 담길 LKBEngine_SOURCE 프로젝트를 하나 추가해준다.
- 이때 프로젝트는 공유 항목 프로젝트로 설정한다.
- 여기에 헤더 파일과 cpp 파일을 추가해준다.
- 다음과 같이 테스트 코드를 작성했다.
- 다음과 같이 작성 후 빌드하면 어떻게 될까?
- 현재 Edit_Window (윈도우 화면 로직이 담긴 main.cpp 파)에 정적 라이브러리 빌드를 통해 만들어진 lib 파일을 pragma로 연결해준 상태 (참조 추가를 해도 좋다)
- 정적 라이브러리로 연결되어 있기 때문에, LKBEngine_SOURCE에 담긴 파일 (정적 라이브러리)이 수정되었으므로 이게 한 번 재빌드가 되어야 하고, 전체 프로그램인 Edit_Window.exe도 한 번 더 재빌드 되어야 한다.
- 총 2번 재빌드 되는 셈.
- 여기서 Edit_Window (main.cpp) 만 수정되면 빌드가 몇 번 될까? 안에 포함되어 있는 정적 라이브러리 까지 2번 재빌드가 될까?
- 그렇지는 않다. Edit_Window.exe만 재 빌드 되는데, 안에 들어있는 정적 라이브러리인 lib 파일의 수정이 없기 때문이다.
반응형
'게임 엔진 개발' 카테고리의 다른 글
[게임 엔진 개발] - QueryPerformanceFrequency / QueryPerformanceCounter (1) | 2024.07.01 |
---|---|
[게임 엔진 개발] - 키보드 / 마우스 입력 처리 (Input) (1) | 2024.07.01 |
[게임 엔진 개발] enum class & static 변수 선언 (0) | 2024.06.27 |
[게임 엔진 개발] DC란 무엇인가? (1) | 2024.06.25 |
[게임 엔진 개발] WinMain 함수란? (0) | 2024.06.25 |