Game Programming Gems 7 추천 및 간단 내용 요약

GPG 카탈로그에서 다루는 책들을 읽을 때 도움이 될만한 참고자료를 추천하는 게시판입니다.
(참고자료 추천 요청을 받는 곳은 아닙니다.)

Moderator: 류광

쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

Game Programming Gems 7 추천 및 간단 내용 요약

Post by 쌀밥 »

아직 GPG7 번역서 소식이 없는것 같습니다(?!)

GPG 7이 2008년 1월에 발매된 책이니 이제 8권이 나올때도 된것 같은데,
조금 늦은 감이 있기는 합니다만 제가 7 권을 읽고나서 내용이 워낙에 좋아서 추천을 하려고 글을 적어봅니다.

개인적으로 기억을 한번 더 되살려도 볼겸, 각 쳅터에 대한 간단한 내용정리를 해보았으니 참고하시기 바랍니다.



1. 프로그래밍 일반 파트

1.1 Efficient cache replacement using age and cost metrics
이 내용은 케슁에 대한 내용인데, 흔히 사용하는 LRU 나 MRU 방식이 아닌 두가지의 중간 형태를 제안하고 있습니다. 예제로 사용하는 적용 사례는 텍스쳐 사용에 대한 케슁입니다. 기본 아이디어는 사용된 데이터에 사용 기록을 할때, 마지막으로 사용된 시간을 표시하거나 사용된 횟수를 카운팅 하던 기본 방식이 아니라 시간에 따른 사용 표시 마크를 하는 방식을 사용한다는 것입니다. 예를 들어, 방금 사용된 데이터는 (1을 추가해서) 0001 로 표시(25%)하고, 그 다음 회차에 다시한번 사용되면 0011 (50%) 이 되고, 그 다음 회차에 사용되지 않으면 (0을 추가해서) 0110 (50%)이 되는 식입니다.

개인적인 생각으로는 매우 참신한 아이디어입니다. 뒤의 clipmapping 방식과 함께 조합하면 텍스쳐 케슁에 상당히 효율적일것 같다는 생각입니다.


1.3 Optical flow for video games played with Webcam.

최근 각광받고 있는 Computer Vision 기술에 대한 내용입니다. 공개 라이브러리인 OpenCV 를 사용해서 PS3 에서 사용되던 Eye Toys 같은 것을 구현하는 방법을 매우 쉽게 설명하고 있습니다.

원래 Computer Vision 분야가 내용이 방대하기 때문인지, 이 글에서 CV 기술을 설명하지는 않는게 좀 아쉽습니다. 참고로 여기에 사용되는 기술은 워낙 간단한 것이라 최근 관심을 집중 시키는 Natal 이랑은 완전히 다른 기술일껄로 생각됩니다.


1.4 Design and implementation of a multi-platform thread engine.

Thread engine 이라는 것을 구현해서 소스를 제공하는 글입니다. 상당히 흥미롭다고 생각하고 읽었습니다만 글 내용은 제공되는 소스 사용법 정도로 그치는 것 같아서 아쉬웠습니다. 기본 개념은 쓰레드 생성을 이 엔진에게 전담시키고, 사용자는 작업을 job 단위로 이 엔진에게 넘기는 것입니다. 그러면 engine 에서 쓰레드가 작업을 완료하고 돌아올때마다 job 큐에서 한개씩 꺼내서 새로운 작업을 시키는 방식입니다. 기본 개념은 간단한데, 사실 직접 구현해서 쓸려고 하면 좀 성가실것 같습니다. 개인적으로는 job 단위로 프로그래밍 하는게 쉽지 않을것 같다는 생각이 들더군요...


1.8 Deferred function call invocation system

개인적으로 상당히 인상적이었던 글입니다. 무려 서너장밖에 안되는 짧은 글이어서 더 좋았던것 같습니다. ㅡ.ㅡ
클라이언트 프로그램은 time-critical system 이기 때문에, frame 간에 주어진 30ms 안에 모든 작업을 끝내야 합니다.
그런데 돌출되는 event 들 (사용자의 USB 연결등)로 인해 인터럽트 되게 되면, 인터럽트 헨들 하는 코드로 갑자기 흐름이 넘어가게 됩니다. 물론 message 방식을 이미 사용하고 있다면, message 생성해서 큐에 넣어두고 나중에 처리하면 되겠습니다만, 이 글에서 제안하는 방법은 그런 메시지 큐 없이 함수를 나중에 호출할수 있도록 뒤로 미루는 방식을 설명합니다.

책에서 제시하는 한가지 흥미로운 응용방법은 Vertical Blanking Interval 이 발생하는 짧은 시간동안에 system memory 에 있는 데이터를 video memory 로 전송하는 작업을 수행하면 VBI 동안 그냥 허송으로 시간을 보내지 않고 유용하게 활용할수 있다는 것입니다.


1.10 Advanced debugging technique

디버깅과 관련된 내용인데, 주되게는 메모리 누수를 잡는 방법을 설명했다고 기억합니다. 소스 코드가 제공되고 있어서 사실 복잡한 내용은 그냥 제공되는 소스 코드에 의존하고 싶다는 생각이 들더군요...



2. math 파트

2.1 Random number generator

GPG 의 단골 주제 인것 같은데 high-quality 의 난수 생성 방식에 대해 설명하고 있습니다.
이 글을 읽어보면 이제까지 GPG 에서 소개된 난수 생성 방식은 사실 모두 문제가 있었으니 이걸써라. 하는 것 같은데, 이쯤되면 신뢰할수 없다! 하는 느낌마저 들더군요.

하지만 아직까지도 rand() % 10 이런식으로 난수를 생성하는게 문제 없다고 생각하는 프로그래머들이 많다는 것을 감안해보면 여전히 의미있는 글이라고 생각합니다.


2.2.Fast generic ray-query

kD-tree 를 사용해서 ray tracing 을 하는 방식을 설명합니다. kD-tree 를 간단히 설명하면, Axis-aligned BSP 라고 할까요? BSP 방식과 비슷하지만 임의의 폴리곤을 기준으로 공간을 가르는 BSP 와는 달리 axis 에 종속적인 좌표값으로 공간을 분할합니다. 때문에 실행 시간에 tree 탐색이 빠르지요. 문제는 (BSP도 그렇듯이) 이 tree 생성이 여전히 실시간에 안되어서 전처리로 해야한다는 것이군요.

ray tracing 은 rendering 의 방법 뿐만 아니라, AI 에서 NPC 의 시야 탐색 정보나 가청거리 확인 등에도 활용될 수 있다는 점에서 중요한 기술이라고 생각됩니다.


2.3. Fast rigied body collision detection using farthest feature map

farthest feature map 이라는 방식을 사용해서 강체 충돌을 아주 빠르게 수행하는 방식을 소개하는 글입니다. 여기서 빠르게 라는 것은 O(1) 이라는 놀라운 속도 입니다. 이런 속도를 얻을 수 있는 이유는, 이 방식이 texture map 에다가 선처리된 정보를 저장하고 있기 때문입니다. 기본 아이디어는 이렇습니다. 흔히 강체 충돌에 사용하는 Bounding Volume(BV)을 원이나 박스와 같은 단순한 도형을 사용합니다. 하지만 farthest feature map 이라고 부르는 이 텍스쳐에는 해당 강체의 중심점을 기준으로 중심점과 물체에서 가장 먼 거리의 길이를 texture map 에 저장해 둡니다. 그래서 단순히 "반지름값" 이나 "박스 half-distance" 가 아니라, 구체적인 거리 값을 바로 얻어낼수 있는 것입니다.

개인적으로는 "상당히 흥미롭"지만 이런식으로 하면 texture map 을 너무 많이 쓰게 될것 같아서 실용성이 의심되었습니다. 하지만 물리 충돌을 많이 사용하지 않는 게임이라면 충분히 고려해볼만하다는 생각도 들었습니다.


2.5 XenoCollide : Complex collision made simple

물리 충돌에 대한 글인데, 개인적으로는 GPG 통털어서 가장 좋은 글이 아니었나 생각합니다. 원래 계산이 복잡한 SSV 도형을 "support point"라는 개념을 사용해서 간단히 계산하는 아이디어를 제공합니다. 원래 GJK 알고리즘은 다각형에는 잘 되는데 구나 곡면에서는 애로사항이 발생합니다. 이 글에서 제시하는 GJK 의 변형인 MPR 이라는 방식은 이런 문제를 개선하고 다양한 조합의 기본 도형을 사용할수 있게 하고 있습니다. 성능 평가 표 같은게 없어서 얼마나 느려지는지는를 알수 없는게 좀 아쉽더군요. (더 빨라지지는 않을것 같습니다)



3. AI 파트

이번 AI 글들은 기술적인 내용보다는 컨텐츠와 관련된 것들이 많았던것 같습니다.

3.4 All about attitude

이 글은 케릭터의 감정과 태도에 대해 어떻게 구현하면 좋을지 여러가지 상황을 ㅤㅎㅜㅀ어주는 글입니다. 예를 들면 "좋다/싫다" 의 수치를 어떻게 관리할것인가 하는 식입니다. 글을 읽고 있으니 지금까지 게임들이 단순화되고 지루해지는(?) 이유가 AI 의 부족때문이 아니었나 하는 생각도 들 정도로 여러가지로 생각할 꺼리를 제공하는 글이었다고 생각합니다.


3.5 Understanding intelligence in games using player traces and interactive game graph

이 글은 FPS 게임의 로그를 분석하고 그 분석 결과를 가지고 NPC 를 좀 더 지능적으로 만드는 방법을 설명하는 글입니다. 주되게는 로그를 어떻게 분석할것인지에 대한 구체적인 방법과 그에 대한 경험을 공유하는 유용한 글이었다고 생각합니다. 간단히 정리하면, "로그는 (숫자 데이터가 아니라) 3D 공간에 보여져야 분석이 가능해진다"라고 할수 있겠습니다.


3.6 Goal-Oriented Plan merging

온라인 게임 개발이 주를 이루는 한국에서 NPC 개발할일이 별로 없을것 같은데, 이 글은 NPC 의 행동을 "계획"을 중심으로 어떻게 결정하도록 할것인지 설명하는 글입니다. 예를 들어, "센드위치를 만들어 먹는다" 라는 계획을 설정하면, "빵을 얻는다", "야체를 얻는다" 등의 선결 처리되어야할 행동들이 도출되고 이 각각의 종송관계가 병렬인 경우과 직렬인 경우를 고려하는 방법을 설명하고 있습니다.


3.7 Beyond A* : IDA* and Fringe Search

AI 의 빠지지 않는 단솔 손님인 A* 개선 방식입니다. 개인적으로 A* 는 볼때마다 이해한것 같은데 금방 또 까먹곤 하는 알고리즘이었습니다. 근데 이 글을 읽고나니 이제 안 잊어먹을것 같습니다. 이 글에서 설명하는 A* 는 이런식입니다. 기본적으로 "넓이 우선 탐색" 방식의 확장인데, 차이점은 2가지다. 첫째는 각 노드를 확장해서 탐색해 나갈때 cost 값을 누적한다. 두번째는 cost 값이 이미 계산된 노드에 대해서는 최저값의 cost 가 우선한다. 그리고 여기에서 "informed search" 방식을 사용해서 heuristic A* 검색을 간단히 설명합니다.

이 글의 핵심은 A* 가 node 관리에 드는 비용이 심각하다는 문제점을 개선하기 위해 IDA* 라는 방법을 제시하는 것입니다. 그리고 IDA* 의 문제점을 다시 한번 개선하기 위해 IDA* 와 A* 의 중간 개념쯤 되는 Fringe Search 알고리즘을 소개합니다.



4. Audio 파트

이번 GPG 의 오디오는 Audio engine 에 대한 글이 많습니다. 그리고 아쉽게도 소스 제공되는게 거의 없군요. 그리고 Audio 관련은 Signal processing 관련 지식이 없는 분들께는 이해가 안될만한 내용도 많았습니다.


4.3 Listen carefully, you probably wouldn't hear this again

그런중에서도 이 글은 상당히 간단하면서도 기발한 방법으로 실시간 소리 생성을 하는 방법을 제공합니다.
예를 들어, 동전이 테이블에 떨어지는 소리를 녹음할때, 하나의 소리는 여러가지 단위 소리들의 조합인데, 예를 들어 동전에서 만들어지는 소리와, 충돌시 짧게 발생하는 소리, 충돌후 길게 발생하는 메아리 효과, 테이블이 만들어내는 소리 등... 이 것들을 하나로 뭉쳐서 "동전이 테이블에 떨어지는 소리.mp3" 이런식으로 소리를 관리해 왔다고 한다면, 이제는 그ㅤㄹㅣㅎ거 단위 소리들을 묶어서 저장하지 말고 각각 때어내서 저장한다음에 실시간에 random 값을 활용해서 재 조합하면 항당 다른 소리를 들을수 있게 된다는 것입니다.

구현에 대한 여러가지 구체적인 조언도 있는데, 읽어보면 설득력있게도 추가 성능 비용은 더하기 연산 정도로 매우 저렴하고 효율적이라는 설명이 있습니다.



5. Graphics 파트

GPG 에서 가장 중요했던(?!) 파트인 그래픽스 파트입니다. 거의 전부다 마음에 들었는데 그중에서도 clipmap 구현 부분은 너무 감동받았습니다.


5.1 Advanced particle deposition

절차적인 방법으로 지형을 생성하는 방법을 설명하는데, GPG5인가에서 이미 설명된것을 개선하는 글입니다.


5.2 Reducing cumulative errors in skeleton animation

에니메이션에 사용되는 transform matrix 의 에러를 줄이는 방법을 설명합니다. skeleton 방식의 에니메이션은 흔히 bone 의 계층 구조를 사용해서 transform 하게 되는데, 자식 노드에 있는 bone 들은 부모 노드들의 transform 을 모두 적용한뒤에 추가로 matrix 연산을 하는게 일반적입니다. 그렇게 되면 부모노드들에서 발생하는 소숫점 부정확도 오류가 조금씩 조금씩 누적되어서 발이나 손 같은 최종 노드에 가면 에러가 눈에 보일정도가 되어버린다는 문제를 지적합니다. 이 글의 기본 아이디어는 (max plug-in 등에서) transform matrix 들을 계산할때에, 부모 노드에서 발생하는 에러들을 고려해서 child 노드에 사용할 matrix 를 보정하면 에러를 현저히 줄일수 있고 추가 비용도 없다는 것입니다.


5.5 Animation relief imposters using Radial basis functions textures

이 글의 제목에 흥미로운 키워드는 "Animation", "Relief", "Imposter", "Radial basis function" 입니다. 근데, 사실 Imposter 나 relief 에 대한 내용은 없다고 봐도 되겠고, RBF 를 사용해서 texture 를 animation 하는 방식을 설명하고 있습니다. 원래 relief mapping 은 parallex 효과가 있어서 보는 각도에 따라 다른 모양이 보여지는데, 이 점을 활용해서 animation 을 더 동적으로 할수 있다는 것입니다. 그런데 기본아이디어는 relief 뿐만 아니라 일반 texture 나 billboard 에도 사용될수 있는 아이디어입니다.


5.6 Clipmapping on SM 1.1 and higher

처음에는 SM 1.1 이 뭔가 했더니 Shader Model 을 의미하는 거더군요 ㅡ.ㅡ;;
이 글은 SM 을 사용해서 Clipmapping 하는 방법을 소개합니다. Clipmapping 이라는것은 SGI 에서 96년도에 개발한 방식이므로 이미 10년도 더 된 오래된 기술입니다. 그런데 저는 이제까지 한번도 이렇게 훌륭한 기술을 들어본적이 없군요. 매우 매우 강력히 추천하고 싶은 훌륭한 기술입니다.

흔히 게임을 개발하면 한정된 Video memory 때문에 큰 texture loading 에 애로사항이 만개합니다. 그런데 지형이나 하늘과 같인 물체에 사용되는 커다란 텍스쳐가 고화질인 경우에는, 사용하지 않는 지형의 텍스쳐 정보까지 모두 video memory 에 올려 놓아야 하지요. 때문에, 당장에 사용되는 부분의 텍스쳐는 고화질로 사용하고 사용되지 않고 있는 부분은 저화질로 사용하는 유동성을 원하게 되는데 바로 clipmapping 이 그 기능을 구현한 방식입니다.

거기에 더해서 clipmapping 을 사용하면 실행 시간에 동적으로 텍스쳐를 매우 매우 효율적인 방법으로 갱신 할수 있어서, 일종의 google map 에서 보여지는 것 처럼 처음에는 저화질로 보였다가 점진적으로 고화질로 갱신되는 (스트리밍 텍스쳐와 같은) 효과를 얻을 수 있습니다.

기본 아이디어나 구현도 매우 간단해서 매우 강추하고 싶은 글입니다.


5.7 Advanced decal system

GPG 게시판에 종종 올라오는 질문들 중에 "벽에 박힌 총알 어떻게 표현해요?" 하는 것에 대한 답글이 되겠습니다. 이 글은 좀 더 나가서 bump mapping 이 적용된 폴리곤에 어색하지 않게 decal 을 표현하는 방법을 설명하고 있습니다. 구현을 보면 render target 으로 2장의 텍스쳐를 추가로 사용하는 방식이 기본 아이디어인데, 성능이 좀 걱정되더라구요. 근데 이 글에서 성능 평가 표도 같이 보여주면서 느려지지 않는다고 안심시키고 있습니다. 하지만 저는 여전히 커다란 텍스쳐 두장을 자주 쓰지도 않는 bump 를 위해 사용한다는게 여전히 좀 걸리더군요.


5.8 Mapping large textures for outdoor terrain rendering

이 글은 Flight simulator 와 같이 넓은 지형을 텍스쳐로 커버해야하는 경우에 어떻게 해야하는지 설명합니다. 기본 아이디어는 Clipmap (!!!) 입니다. 이 글은 앞서의 clipmap 설명이랑은 약간 다르게 fixed-pipeline 에서 구현하는걸 중점적으로 다루고 있습니다. mip-map 피라미드에서 상위(?) 부분은 일반 mip-map 으로 처리하고 그 하위 부분은 stack 으로 처리하는 방법으로 말입니다.


5.10 Cheap talk: dynamic real-time lipsync

케릭어 입모양을 텍스트 자모음에 따라 싱크 시켜주는 방식을 설명합니다. CMU 사전에 나오는 32개의 발음 기호를 16개의 입모양과 맵핑 시키고 그것을 morph 시켜서 표현하는 방법입니다. FaceGen 을 사용해보신분이라면 입모양 morph 는 새로운 내용은 아닐것 같지만, 게임에 실시간으로 적용하는 코드를 얻을수 있다는 점에서 가볍게 읽어줄만한 내용이었습니다. (참고로 Graphics 관련 파트는 이 글의 저자가 편집했습니다. 그래서 그런지 좀 쓸데 없어보이는 컬러 이미지가 두개나 들어가 있더군요 :-) )



6. Network 파트

네트웍 분야는 이번에는 3개의 글 밖에 실리지 않았는데, 그 중에서도 한개가 모든 서버 개발자가 읽어야할 만큼 잘 정리되고 제법 추상화도 잘 되어있다고 생각합니다. 현직님께서 쓰신글이라서 형식적으로 하는 말이 아니라, 정말로 좋은 글이었습니다.


6.1 High-level abstraction of game world synchronization

기본적인 아이디어는, 서버와 클라이언트 간의 world 데이터 변경을 어떤 방법으로 동기화 시킬것인가 하는 것입니다. 흔히 서버 프로그래머들이 패킷 생성하는 방식과 비슷하게, 동기화 관련 메타 파일을 먼저 작성하면, 그 파일을 파싱해서 C++ 코드를 생성해냅니다. 이렇게 자동생성된 클레스가 서버측과 클라이언트 측에도 동일하게 사용되는 것입니다. 그리고 Conditional, periodical, static 등의 동기화 특징들을 정의하여 특성에 맞게 동기화 시켜야 한다는 점을 설명하고 있습니다.

특히 케릭터의 위치와 시야에 따라 동기화 범위가 케릭터 별로 한정되도록 구현한 부분이 마음에 들었습니다. 저는 평소에 서버 프로그래밍 모델로 black board 패턴을 염두에 두고 있었는데, 이 글에서 사용하는 방법이 그것과 비슷한 방식이어서 더 마음에 들었습니다.



7장 Script 파트

7장은 스크립트 관련이라고 되어있는데, 마음에 드는 글은 하나도 없더군요.


7.1 Automatic Lua binding system

제가 Lua 문법이나 특징을 몰라서 읽지 못했습니다. 간단한 내용은 C++ 에서 선언한 클레스를 Lua 에서 사용할수 있도록 해주는 번역기 같은 코드를 제공하는 것 같습니다.


7.2 Serializing C++ object into a database using introspection

제가 Java 에서 좋아하는 기능중 하나가 C++ 에는 없는 Serializing 기능입니다. C++0x 에도 포함될것 같지 않아서 나름 실망하고 있었는데, 혹시나 하고 글을 읽어보니 역시나 자동으로 serializing 해주는 것이 아니라, 외부에 맵핑 파일(Metafile 이라고 부르더군요)을 두어서 DB 와 연동시켜주는 것입니다. Java 에 익숙한 분들이라면 hibernate 를 생각하시면 되겠습니다.


7.3 Dataport

모든 프로그램 내부의 데이터를 코드 밖으로 빼고 Data-driven 으로 개발해야한다는 기본 전재로 데이터 관리를 해주는 중앙 메니터급 클레스를 소개 하는 글입니다. 그런데 개인적으로는 data-driven 도 좋기는 하지만 이 경우는 너무 극단까지 간것 같다는 생각이 들었습니다. 그래서 또 데이터와 코드간의 맵핑을 관리하는 비용이 증가할것 같은데, 글에서도 그런 단점을 지적하고 있더군요.


7.5 Dance with Python's AST

AST 라는 것은 Abstract syntax tree 의 줄임말로 파이썬에서만 사용되는 용어가 아니고 프로그래밍 언어 일반에 사용되는 용어입니다. AST 는 소스 코드를 파싱해서 트리 형태로 만들어서 사용자에게 소스 코드 탐색및 추가 작업을 할수 있도록 해주는 것입니다. 흔히는 Visitor 패턴을 사용해서 트리를 탐색하도록 구현합니다. 저는 작년에 Eclipse 내부에서 제공하는 Java AST 를 사용해본적이 있어서, python 문법은 모르지만 내용은 이해할수 있었습니다.

이 글에서 설명하는 것은, AST 의 많은 활용법들 중에서도 Python 코드 안에 있는 텍스트 문자열만 뽑아내는 방법을 설명합니다. 하지만 이 글을 바탕으로 AST 의 활용법을 익힐수 있는 계기가 된다면 또 그 나름의 의미가 있는 글이 될것도 같습니다.



GPG 가 원래 항상 어렵다고 생각해왔기 때문에 읽기 전에는 좀 겁이 났습니다만, 막상 읽어보니 읽을만 하더군요. 생각보다 빠르게 읽을수 있어서 5일정도 걸린것 같습니다.

아무튼 참고되시길...
I want to live in korea, making programs, but...
http://wrice.egloos.com
pacman
Posts: 188
Joined: 2004-04-13 12:48

깔끔하게 요약하셨네요.

Post by pacman »

수고하셨습니다.
책을 사놓기만하고 아직 읽어보지 않아서 많은 도움이 되었습니다. :D
강컴이나 Yes24 같은 곳에 서평으로 올리셔도 좋을 듯~
배우고 때맞춰 익히니 기쁘지 아니한가!
lancekun
Posts: 62
Joined: 2008-06-06 02:04
Location: 호드
Contact:

Post by lancekun »

오~ 나중에 6권을 읽은뒤 7권을 구입한후 참고해보면 좋겠군요~

좋은글감사합니다.
안녕하세요~ 랜스군입니다. 모두 열프 '_'

랜스군의 게임공작소
http://lancekun.com/
Post Reply