GPG2 번역일지 2001.09.30

제목 그대로..<BR>번역하면서 생각나는 것들을 올리겠습니다... 가끔 질문도 할께요(번역 용어 등등)..

Moderator: 류광

류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

내일이 추석이군요...

성룡 영화 좀 해줄라나.. -.-

지난 번역 일지 보니까 거의 섹션 소개더군요...

이번에도 그런 식으로... ^^

1.11은 내장 프로파일링 모듈.. 1권에서도 비슷한 글이 있었죠.. 2권의 글은 C++의 객체지향적 기능을 적극적으로 사용한다는 점이 좀 틀리네요. COM 비슷한 인터페이스-구현 클래스 구조입니다.

1.12는 지금까지 글들 중 베스트입니다. 내용은 뭐 어려운 것이 없는데.. 일종의 콤롬부스의 달걀이랄까... 무릅을 치게 만드는 글이네요.

주제는 윈도우즈 메시지 모델 대신 도스 같은 선형적인 모델을 적용하자는 것인데요. 예를 들어서 게임 제일 처음에 발행사 로고-개발사 로고-오프닝 동영상-메인 타이틀 화면 순으로 화면이 갱신된다고 할 때,

윈도우즈의 메시지 펌프 방식은
<pre>
메인루프(..)

윈도우즈 메시지 얻기
키나 마우스 입력...
현재 상태에 기반해서 상태 변경

switch 현재 상태
case 발행사 로고
.... 발행사 로고 한 프레임 표시 루틴 호출
case 개발사 로고
.... 개발사 로고 한 프레임 표시 루틴 호출
....
루프 끝
</pre>

선형적 프로그래밍 모델은..

발행사 로고 루틴 호출

개발사 로고 루틴 호출

오프닝 동영항 재생 호출

메인 타이틀

게임 시작

이 때 사용자와의 상호작용은 각각의 루틴에서 돌아갑니다... 즉 실행 흐름이 여기 저기로 왔다갔다 하는 일이 거의 없다는..

이런 것이 가능하게 하는 비밀은 짐작하셨겠지만 멀티스레딩입니다... 윈도우 만들고 초기화 좀 한 후에 게임 스레드를 따로 띄우고, 그 스레드 안에서 도스 시절처럼 그냥 순서대로 게임을 돌리는 거죠... 메인 스레드에서는 윈도우 종료 메시지라던가 비활성화 메시지 같은 것만 처리하구요(키 입력 같은 것은 어차피 다른 함수나 DI로 처리하면 되니 메시지 루프 안에 포함시킬 필요가 없죠).

콜롬부스의 달걀 스타일의 이야기죠..^^

1.13, 1.14는 프로그램 안에서 프로그램 자신의 기계어 코드를 변경해서 기기묘묘한 일들을 하는 것.. 호출 반환 순서를 마구 바꿔버린다던가.. 자주 호출되는 루틴을 실행 도중 아예 어셈 코드를 직접 만들어서 구현해버리는 등... 소스 코드 대부분이 어셈-.-

사실 기계어 코드 최적화보다는 알고리즘 자체를 개선하는 게 속도 향상에 더 도움이 되지만, 게임 콘솔(특히 몇십 Mhz 짜리 CPU 사용하는 휴대용 게임기)라면 이런 기법들이 꼭 필요할 듯...

1.15는 포럼 초창기에 잠깐 언급되었던 게임 데이터 파일 만들기입니다... 여러 파일들을 하나의 파일로 몰아넣고 사용하는 방식...(블리자드의 GRP, MPQ 등등)

1.16은 게임 녹화&재생 기능의 구현에 대한 것인데 국내 개발자들이 꼭 고민해봐야 할 주제입니다. 저도 이 주제에 대해 기획 측면에서(게임 리플레이의 공유와 게이머에 의한 게임의 완성-.-;;) 한 번 글을 써보려고 했는데....

1.17은 텍스트 파싱 시스템.. GPG 1권의 데이터 주도적 프로그래밍과 연결되는 성격의 글입니다. 설정 파일이나 스크립트 파일의 해석을 위한 기본적인 프레임웍인데요.. C/C++ 방식의 #define 매크로와 #include를 지원함으로서 소스코드와의 연동을 가능하게 한다는 점이 특징.

1.18은 게임 내에서 게임을 조율하기 위한 인터페이스에 대한 글입니다. 이 역시 요즘 게임 개발에서 필수적인 기능이죠.. 실행 도중 몇 가지 중요한 변수들의 값을 조정하고, 조정된 값들을 파일로 덤프하고, 또 파일로부터 값들을 불러오기도 하고 등등...

1.19는 의사난수가 아닌 진짜 난수를 얻기 위한 알고리즘을 소개하는데.. 재미있네요. 1.16은 게임플레이의 재현을 위해서 '반복가능하고 예측가능한' 의사난수의 중요성을 강조하는 반면, 여기에서는 새로운 게임 상태를 위해 또는 멀티플레이 게임의 보안을 위해 '반복불가능하고 예측불가능한' 진짜 난수를 이야기합니다...

1.20은 블룸 필터라는 것을 소개하는데, 복잡한 연산의 결과를 비트 배열에 담아두고 이전에 한 번 했던 연산이면 결과만 바로 돌려줌으로서 속도를 올리는 기법입니다. 좀 충격이군요...

언제 이렇게 글이 길어졌지.. x.x



<font size=-1>[ 이 게시물 는(은) 수정됨 by : 류광 수정 시간: 2001-09-30 23:53 ]</font>
illb
Posts: 2
Joined: 2001-09-19 09:00

Post by illb »

1.12의 내용을 저는...
1.12에 대한 내용을 저는 Interface로 해결을 했습니다

그니까 C++ 추상 클래스죠

각 state에 대해서 처리해 주는 것은 거의 똑같기 때문에

다음과 같은 Interface를 만들어서

class ISubMain
{
// 초기화
virtual void Init() = 0;
// 계속시리 도는 메인 루프
virtual void MainLoop() = 0;
// 삭제
virtual void Release() = 0;
// 메세지 처리...
virtual LRESULT CALLBACK WndProc(인자들...) = 0;
}

각 state에 대한 부메인 클래스를 만들어 주죠

물론 앞의 Interface를 구현하면 되겠죠

그리고 진짜 메인에서는...

기본적인 일만 수행을 하고 모두 부메인을 넘긴다는...

넘기는 방식을 앞의 것들을 구현한 클래스들의 인터페이스의 배열(길다...)

을 가지고 있어서 각 상태에 인수로 호출을 한다는... 말이 길군요

예제를 들어서...

메인에도 인터페이스에 존재하는 함수들이 있을 터이니...

ISubMain g_aSubMain[SUBMAIN_MAX];
int g_iState;

void AppInit()에서
{
g_aSubMain[STATE_INTRO] = new CSubMainIntro;
g_aSubMain[STATE_INTRO]->Init();
// ... 생성하구 ...
g_iState = STATE_INTRO;
}

void AppMainLoop()
{
g_aSubMain[g_iState]->MainLoop();
}

void AppRelease()
{
// ... g_aSubMain[]에 있는거 다 delete하시구...
}

LRESULT CALLBACK WndProc(... 인자)
{
// 기본적인거 처리하구
// 처리 몬했으면
LRESULT res = g_aSubMain[g_iState]->WndProc(...인자);
// 그래도 처리몬했으면 기본 윈프롹으로...
}

하여 처리를 합니다.

각 부메인을 순차적으로 처리를 한다면 앞의 글같은 내용이 나오겠죠...

물론 좀 다르겠지만... ^^

각 state(g_iState)의 변화와 생성 삭제는 동적으로 처리를 함으로

어디서 해주건 별루 상관은 없겠지만...

그래도 저는 사용 안하면 삭제하고

state의 변화는 메세지로 넘겨 메인에서 처리를 합니다.

온라인으로 작성을 하여서 문제가 있을지 모르겠네요...

GPG 2 빨랑 나왔으면 하네요 -0-; 수고하세요
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

저자는 상당히 게으른 사람인 것 같아요...
1.12의 의도는 상태의 전환이나 실행 문맥의 전환을 최소화하자는 뜻인 것 같더군요...

illb 님의 방식은 잘 정의된 상태 기계 프레임웍인 셈인데... 상태가 늘어나면 늘어날 수록 골치가 아프다.. 라는 것이 저자의 주장인 듯 합니다.

음.. 1권에서처럼, 번역 끝나면 몇 섹션 정도 미리보기로 제공할 생각인데.. 1.12를 미리보기 1순위로 할께요~ 이야기할 것이 많을 것 같네요..


GemSiN
Posts: 5
Joined: 2001-08-16 09:00
Contact:

Post by GemSiN »

호오....
기대됩니다..-_-;;;;

계속 고민해오던 부분인데...

지금하고있는 방법이 상태가 늘어나면 늘어날 수록 골치가 아프다 인것같군요...

미리보기 기대가 됩니다...
Post Reply