GEMS 2권(6)

GEMS 2016. 2. 4. 16:34

1.10 드롭-인 메모리 관리자

메모리 관리자의 기본적인 목표는 메모리 누수를 보고하고, 할당된 메모리 대 실제로 쓰인 메모리의 비율을 계산하고, 경계 위반을 경고하는 것이라 할 수 있다.

메모리 관리자를 사용하기 위해 어떠한 함수를 명시적으로 호출하거나 클래스를 선언해야 할 필요가 없어야 한다. 즉, 헤더파일 한두개를 포함시키는 것 만으로 메모리 관리자가 작동할 수 있도록 해야한다.

메모리 관리자를 사용하면 메모리를 할당, 해제 하는데 필요한 부담을 안게 된다.

그렇기 때문에 게임의 최종 빌드에서는 메모리 관리자를 제거할 필요가 있다.

코드의 수정을 최소화 하기 위해서 디버그 빌드에서만 또는 ACTIVATE_MEMORY_MANAGER같은 매크로가 정의되어 있는 경우에만 메모리 관리자가 작동하도록 만들어야 할 것이다.


1.11 프로파일링 모듈을 만드는 이유

1. 프레임 기반 분석. 게임에서의 단 몇초의 차이도 매우 크다. 그렇기 때문에 여러 병목현상을 분석하기에 프레임 기반 분석이 필수적이다.

2. 언제, 어디서도 분석이 가능하다. 게임 개발 중반, 막바지, 어느 컴퓨터 등 언제 어디서든 분석이 가능하다.

3. 커스텀화. 요즘 게임엔진들은 매우 복잡하다. 수많은 모듈들 중 의심이 가는 특정 모듈에 대해서만 성능 분석을 수행할 수 있다면 매우 편할 것이다.


프로파일링 모듈의 요구사항들

1. 사용자가 응용 프로그램을 빠르게, 그리고 정확하게 프로파일링 할 수 있어야한다.

2. 수행 부담이 적어야 한다.

3. 여러 사용자들이 다른 엔진 모듈들에 대해 신경쓰지 않고 자신의 시스템에서 개별적으로 작업할 수 있어야한다.

4. 프로파일러가 필요없어지면 완전히 제거할 수 있어야 한다.


1.12 윈도우즈 기반게임을 위한 선형적 프로그래밍 모델

다중 스레딩 - 메세지 펌프를 하나의 스레드에 넣고 게임을 다른 스레드에 넣자는 것

MainThread는 RunGame함수를 호출하고 그 함수가 종료되면 WM_CLOSE 메세지를 전송해서 메시지 펌프스레드의 실행을 종료시킨다.

Alt-Tab 문제 - 쓰레드간의 통신을 위한 도구인 이벤트를 사용하도록하자.

(게임의 시작시점에서 수동 재설정 이벤트를 하나 만들고 이 이벤트는 프로그램이 비활성화 되면 false, 활성화 되면 true로 설정되어야 한다.)

게임 루프안에서 매번 호출되는 함수안에

WaitForSingleObject( task_wakeup_event, INFINITE );

와 같은 코드를 넣으면 된다.

그러려면 윈도우 프로시저 루프안에서 APP_ACTIVATE 메시지를 잡아내고 현재 이 응용 프로그램이 활성화되어 있는지 확인해야한다.

만약 비활성화 상태라면 ResetEvent( task_wakeup_event ); 

다시 실행을 재개할 때에는 SetEvent( task_wakeup_event );

* 게임이 비활성화 상태에서도 게임 세계가 갱신되어야 한다면, 게임 스레드 전체가 아니라 렌더링 파이프라인만 유보시키고 게임 세계의 갱신 루틴은 계속 실행되게 만들면 된다.


posted by 알쿠미