22
1.0 데데데 데데데 데데데 데데 1.1 데데 데데데 데데데데데데 데데 데데 1.3 데데데데 데데데 데데데데 데데데데 – GPG 데데데 데데데 2010.03.27

[Gpg1권 박민근] 1.0 1.4 요약 정리

Embed Size (px)

Citation preview

Page 1: [Gpg1권 박민근] 1.0 1.4 요약 정리

1.0 데이터 주도적 설계의 마법1.1 객체 지향적 프로그래밍과 설계 기법1.3 자동적인 단일체 유틸리티

데브루키 – GPG 스터디 박민근2010.03.27

Page 2: [Gpg1권 박민근] 1.0 1.4 요약 정리

1.0 데이터 주도적 설계의 마법

Page 3: [Gpg1권 박민근] 1.0 1.4 요약 정리

기본

Data Driven Design 게임 데이터는 당연히 코드 외부에서

로드되어야 한다 . 개발중에는 XML 과 같은 텍스트 파일로

작업하고 , 실제 배포시에는 이진 파일을 사용한다 .

개발중에는 텍스트 파일을 사용해야 편집 /수정이 가능하다 .

Page 4: [Gpg1권 박민근] 1.0 1.4 요약 정리

최소한의 원칙

상수들을 하드코딩해서는 안된다 !!

Page 5: [Gpg1권 박민근] 1.0 1.4 요약 정리

하드코딩을 아예 없애라

“ 아예 없애라” – 농담이 아님

기획자와 디자이너가 프로그래머 자리에 오지

않도록 만들어라

게임을 데이터를 최대한 추상화 시켜라 !

Page 6: [Gpg1권 박민근] 1.0 1.4 요약 정리

게임의 흐름은 스크립트로 제어할것

연출 , 이벤트의 발생 조건 , 원인 – 결과

로직 , 퀘스트 등은 스크립트로 제어

적절한 스크립트 언어를 선택하라 . 이왕이면

컴파일 가능한 스크립트 언어로

Page 7: [Gpg1권 박민근] 1.0 1.4 요약 정리

스크립트 남용의 해악

게임 디자이너가 스크립트 작성자가 게임

프로그래밍을 하도록 해서는 안된다 – 스크립트의

비율이 프로그래밍보다 많아지면 안된다

과유불급

스크립트는 C++ 보다 디버깅이 어렵다

Page 8: [Gpg1권 박민근] 1.0 1.4 요약 정리

데이터의 중복을 피해라

여러곳에 사용되는 데이터를 하나로 모아라

데이터에 상속 구조를 적용해 보아라 .

Page 9: [Gpg1권 박민근] 1.0 1.4 요약 정리

데이터를 만들어 내는 도구를 작성할 것

텍스트 파일이 작성하기에 너무 큰경우 , 툴을

만드는 것이 훨씬 효율적이다 .

Page 10: [Gpg1권 박민근] 1.0 1.4 요약 정리

좋은 예제

워크래프트 3 – 맵툴 스타크래프트 – 유즈맵 WoW – 플러그인 , UI

Page 11: [Gpg1권 박민근] 1.0 1.4 요약 정리

1.1 객체 지향적 프로그래밍과 설계 기법

Page 12: [Gpg1권 박민근] 1.0 1.4 요약 정리

코딩 스타일

헝가리언 표기법

제일 중요한것은 팀내에 코딩 규약을 반드시

정해야 하고 , 그 규약에 통일된 코딩을

해야만 한다 !

Page 13: [Gpg1권 박민근] 1.0 1.4 요약 정리

클래스 설계

통일된 매서드의 명명 규칙을 사용한다 .

생성자와 소멸자에서 생성 / 소멸 메소드를

호출하는 구조로 작성하면 유연성이 높아진다 .

Page 14: [Gpg1권 박민근] 1.0 1.4 요약 정리

클래스 계통 구조의 설계

포함과 상속을 사용할 곳을 정확히 구별해야 한다 .

Is – a 관계가 성립되지 않는 다면 , 무조건 포함을 사용해야 한다 .

포함을 사용할곳에 단지 편의를 위해서 상속을 사용하면 안된다 !!

상속보다는 포함이 낫다 ( 래핑 )

Page 15: [Gpg1권 박민근] 1.0 1.4 요약 정리

설계 패턴들

싱글톤 패턴

퍼사드 패턴

상태 패턴 (FSM)

팩토리 패턴

Page 16: [Gpg1권 박민근] 1.0 1.4 요약 정리

1.3 자동적인 단일체 유틸리티

Page 17: [Gpg1권 박민근] 1.0 1.4 요약 정리

싱글톤의 정의

클래스의 인스턴스가 단 하나만 존재하는 것을 보장

전역 객체 처럼 사용 할 수 있음

매니저 클래스들 , 리소스 관리 클래스등 , 사운드

관리 , 게임 프레임워크 등 전반적으로 사용

Page 18: [Gpg1권 박민근] 1.0 1.4 요약 정리

싱글톤의 장점

코드의 가독성 관점에서 명료하다 전역 객체처럼 간단히 사용할 수 있다 객체의 생성 , 접근 , 해제 시점을 제어 할 수

있다 .

Page 19: [Gpg1권 박민근] 1.0 1.4 요약 정리

일반 전역 객체와의 차이

전역 객체 – 생성 , 해제 , 접근 시점을 제어할 수 없다 . 가독성이 떨어진다 . 위험하다 .

싱글톤 패턴은 위 문제를 해결할 수 있다 . 원하는 시기에 생성 / 해제 할 수 있으며 , 접근

함수를 통해서 접근 시점을 제어할 수 있다 .

Page 20: [Gpg1권 박민근] 1.0 1.4 요약 정리

전통적인 해결책SingleTon& GetSingle-Ton(){ static T SingleTon; return T;}생성 시점은 제어할 수 있지만 ,

해제 시점은 제어할 수 없다 .

Page 21: [Gpg1권 박민근] 1.0 1.4 요약 정리

더 나은 방식class CTextureMgr{ static CTextureMgr* m_Instance;

public: CTextureMgr() {m_Instance = this;} ~CTextureMgr() {m_Instance = NULL;}

static CTextureMgr& GetInstance() {return *m_Instance;}}

// 사용CTextureMgr::GetInstance().Method();

하지만 , 모든 싱글톤 클래스에 추가 코드가 들어가야 한다 .

Page 22: [Gpg1권 박민근] 1.0 1.4 요약 정리

좀더 나은 방식template<typename T>class ISingleTon{ static T* m_instance;

public: ISingleTon() { int offset = (int)(T*)1 - (int)(ISingleTon<T>*)(T*)1; m_instance = (T*)((int)this + offset); } ~ISingleTon() {m_instance = NULL;} static T& GetSingleton() {return *m_instance;}}

템플릿을 상속 받아 하위 클래스에서 자동으로 싱글톤이 생성되게 한다 .다중 상속 구조가 되는 경우가 있기 때문에 Offset 을 계산해서 할당한다 .