저자 Noel Llopis | 역자 최현호 | 출판사 정보문화사
방학 기간동안 여러가지 책을 읽어보고 리뷰를 하려고 합니다. 작심3일이 되지 않길 빌어야 지요.
비교적 간단해 보이는 책을 덜컥 골랐지만, 생각 외로 깊은 내용을 담고 있어 놀라웠습니다.
C++ 에 대해선 한번쯤 생각해 봐야할 내용들이 책에 많이 포함되어 있네요.
C++에 대한 기본 지식을 가지고 있는 유저에게 맞는 책으로,
곰곰히 생각해 봤지만 C++ 을 처음 접하시는 분에겐 무용지물 일것 같습니다.
게임 프로그래밍의 특성상 다른 프로그래밍에서 간과하기 쉬운 성능에 대한 부분의
저자의 의견이 다수 포함되어 있고, 게임 엔진의 아웃트라인을 잡는데 어렴풋이나마 도움이 될것 같습니다.
물론 제 생각 이지만요~ " 한번쯤 읽어보면 아주 유익한 책 " 이란 결론을 내립니다.
난이도 : A / 재미 : D / 읽기쉬움 : C / 유익함 : B+
리뷰 part 1.
게임 프로그래머를 위한 C++
1. 상호작용이 가능한 속도로 실행된다.
2. 최소한의 프레임 속도(초당 30-60 프레임)를 보장한다.
3. 기계를 장악하거나 혹은 거의 대부분을 제어한다.
4. 매우 많은 자원을 이용한다.
5. 다중-플랫폼 환경을 위해 개발된다.
Part 1.
C++의 힘을 끌어내자.
클래스
상속
Enemy 클래스를 토대로 Boss 클래스를 만들 수 있다.
부모 클래스의 특정함수를 완전히 대체하지 않고 약간 추가 하려면 다음과 같이 구현을 작성한다.
void Boss::RunAI()
{
Enemy::RunAI();
}
다형성과
다형성은 여러가지 타입의 유닛들을 실제의 형에 관계없이 한 번의 함수 호출로 모든 적 유닛들을 관리할 수 있게 한다.
가상함수
포인터는 부모형이고 개체가 자식이면 부모의 선언된 함수가 가상 함수인지의 여부에 따라 함수 호출이 달라진다.
규칙 1: 포함 vs 상속
상속할 때는 ‘~이다’ 의 관계가 성립 하여야 한다. ‘가진다’ 라고 말할 수 있는 것을 포함이라고 한다. 상속을 이용해야 하는지 결정하기 힘들다면 하지 않는 것이 좋다.
규칙 2: 동작 vs 데이터
데이터가 아닌 동작을 변경하는 경우에만 상속을 이용한다.
상속을 이용할 상황과 피해야 할 상황
가상 함수를 이용 하는 데는 얼마간의 성능 저하가 따른다. 가상함수의 선택은 신중해야 한다.
상속의 구현(고급)
단 한 개라도 가상 함수를 포함하는 클래스는 모두 vtable을 가지며, 테이블의 적절한 슬롯을 인덱스하는 방식으로 런타임 시에 호출될 함수를 결정한다. vtable은 개체가 아닌 클래스 당 한 개씩 존재한다. 256*256 크기의 맵이 필요하다면 개체의 수는 65,536개가 된다. 각각의 객체가 vtable을 가질 필요는 없으며, 대신 vtable을 가리키는 포인터만큼 거지게 된다. 포인터를 위한 64KB와 vtable 자체의 크기만큼 메모리를 더 사용하게 된다.
비용 분석(고급)
과정 1. 특이한 점이 없어 보이는 함수 호출로 시작된다.
pEnemyUnit->RunAI();
과정 2. 해당 개체의 vtable 포인터를 얻는다.
과정 3. 호출하고자 하는 함수에 해당하는 오프셋 항목을 vtable에서 얻는다.
과정 4. vtable 항목에 지정된 주소로 함수 호출이 이루어진다.
상속과 가상 함수를 이용해 특정한 동작을 오버라이드하도록 게임 구조가 만들어졌다면 뒤늦게 이 구조를 변경하는 일이 극히 어렵다는 것이다.
가장 좋은 방법은 프로그램 내에서 가상 함수를 호출할 때 일어나는 결과를 이해하고 게임을 개발할 때 이를 염두에 두는 것이다. 물론 논리적인 지식만으로 게임이 실행되는 상황에서의 많은 작업과 프로파일링, 예상한 만큼의 결과가 나타났는지를 확인하는 등의 일을 대신할 수는 없다.
대안(고급)
상속을 통하지 않고 C를 이용해 비슷한 기능을 구현해보는 것.
1. 하나의 구조체와 다수의 조건문 : 모든 구조체가 같은 크기가 되므로 메모리 낭비와 if 문의 수가 늘어나면 더욱 심각한 성능 저하가 발생한다.
2. 하나의 구조와 switch 문의 이용 : 컴파일러는 결국 if 문을 이용한 것과 동일한 코드를 만들어낼 가능성이 높다.
3. 포인터 테이블 : 성능 면에서는 상속과 가상 함수를 이용한 것과 동일하다. 차라리 컴파일러에게 맡겨두는 것이 좋다.
앞서 소개한 방법들보다는 상속과 가상 함수를 이용하는 것이 좋으며, 코드의 최적화나 관리 면에서는 우리보다 컴파일 능력이 뛰어나다.
프로그램 아키텍처와 상속(고급)
상속은 프로그램의 아키텍처에 전반적으로 좋지 않은 영향을 줄 수 있다. 상속은 또한 프로그램 디자인을 경색시키는 효과가 있다. 포함은 상속과는 달리 프로그램 디자인을 경색시키지 않으며 유연한 상태를 유지시켜준다. 그러나 모든 상속을 포함으로 대체하는 것을 권장하는 것은 아니다. 상속이 문제가 될수 있을만한 부분, 즉, 상속의 수준이 지나치게 깊어질 경우에는 포함을 이용하여 두 단계나 세 단계의 작은 단계로 나눌 수 있다.
Trackback URL : http://oneil.cafe24.com/tatter/trackback/6