[디자인 패턴] #16_공간 분할 패턴, Spatial Partition 게임 디자인 패턴 중 "최적화 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 20 항목, "공간 분할"에 해당하는 내용입니다. Overview 1. 목적 공격 사정 범위 안에 존재하는 객체들을 찾는 등 주변 객체들을 찾는 작업은 월드 내 객체들을 순회합니다. 월드 내 객체의 개수가 많아질수록, 객체들을 전부 순회하는 작업은 성능 저하의 요인이 될 수 있습니다. 월드 내 주변 객체 탐색 성능을 최적화하기 위해 객체의 "위치 값"에 따라 구성되는 자료구조에 각 객체를 저장합니다. 2. 언제 사용할 것인가? 위치 값을 갖는 객체가 많을 때 위치에 따라 객체 탐색 성능에 영향을 줄 때 3. 주의할 점 객체의 개수가 충분히 많을 ..
언어/디자인 패턴
[디자인 패턴] #15_객체 풀, Object Pooling 게임 디자인 패턴 중 "최적화 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 19 항목, "객체 풀"에 해당하는 내용입니다. 개념 런타임 중 객체의 할당과 해제를 반복하지 않고, 고정 크기 "풀"에 할당된 객체를 재사용함으로써 메모리 사용 성능을 개선합니다! 왜 필요할까? 1. 메모리 단편화, Memory Fragmentation 메모리 단편화란, 힙에 사용 가능한 공간이 여유로운 크기로 뭉쳐 있지 않고, 작게 조각나 있는 상태를 의미합니다 전체적으로 사용 가능한 메모리 공간이 충분함에도 불구하고, 연속해서 사용 가능한 영역은 작을 수 있습니다. 이때, 메모리 단편화 문제 + 할당/해제 속도 -> 게임 성능을 저하시키는 요인들을 방지..
[디자인 패턴] #14_서비스 중개자 패턴, Service Locator 게임 디자인 패턴 중 "디커플링 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 16 항목, "서비스 중개자"에 해당하는 내용입니다. Overview 개요 활용 예제 널 객체 디자인 패턴 데코레이터 패턴 #1. 개요 1. 정의 서비스 중개자 패턴은 디자인 패턴 중 하나로, 다수의 서비스나 컴포넌트가 서로 통신할 수 있도록 '중개자'를 도입하는 방법입니다. 따라서, '서비스 중개자' 패턴은 객체 간의 커플링을 낮추고, 유연성을 향상하며, 유지보수성을 증가시키는데 도움이 됩니다. 2. 왜 필요한가? // 정적 서비스 클래스 AudioSystem::playSound(GUN_SHOT_SOUND); // 싱글턴 디자인 패턴 활용 A..
[디자인 패턴] #13_이벤트 큐, Event Queue 게임 디자인 패턴 중 "디커플링 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 15 항목, "이벤트 큐"에 해당하는 내용입니다. 의도 이벤트를 보내는 시점과 처리하는 시점의 디커플링 동기 1. 예제 코드 class Audio { public: static void playSound(SoundID soundId, int volume); }; void Audio::playSound(SoundID soundId, int volume) { ResourceId resource = loadSound(soundId); //특정 Sound를 Play하기 위한 처리 코드... } 사운드 재생을 처리하기 위한 "Audio" 클래스를 가정합니다. 2. 문제..
[디자인 패턴] #12_Component Pattern, 컴포넌트 패턴 게임 디자인 패턴 중 "디커플링 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 14 항목, "컴포넌트"에 해당하는 내용입니다. 개념 1. 의도 한 객체가 여러 분야의 기능들을 "커플링" 없이 다룰 수 있도록 합니다. 복잡한 상속 관계를 통해 여러 기능들을 상속받아 사용하기보다, 각 기능 별 컴포넌트 클래스를 작성하고 해당 클래스 객체를 데이터 멤버로 두어 "디커플링"합니다. 패턴 1. 컴포넌트 패턴 한 객체에 필요한 다양한 분야의 기능들을 별도의 컴포넌트 클래스로 옮겨놓고, 이를 필요로 하는 객체는 단순히 "컴포넌트들의 컨테이너" 역할을 합니다! 2. 왜 필요한가? class Player { public: Player():..
[디자인 패턴] #11_타입 객체, Type Object 게임 디자인 패턴 중 "타입 객체"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 13 항목, "타입 객체"에 해당하는 내용입니다. 개념 1. 타입 객체 클래스 하나를 인스턴스 별로 다른 객체형으로 표현하며, 앞으로 추가할 새로운 클래스들을 유연하게 만들 수 있게 합니다. 2. 왜 필요한가? #include using namespace std; class Monster { public: virtual ~Monster(); virtual string getAttack() = 0; protected: Monster(int initialHealth):health(initialHealth){} private: int health; }; class Dr..
[디자인 패턴] #10_Sandbox Pattern, 샌드박스 패턴 게임 디자인 패턴 중 "행동 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 12 항목, "하위 클래스 샌드박스"에 해당하는 내용입니다. 샌드박스 패턴 1. 정의 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의한다. 2. 상세 내용 * 상위 클래스가 제공하는 인터페이스 없이, 하위 클래스에서 각각의 행동을 정의할 경우? 1. 중복 코드의 문제점 2. 대부분의 외부 코드와 커플링 된다. 3. Too Much Coupling 문제로 외부에서 코드를 변경할 경우, 클래스가 깨진다. 4. 모든 하위 클래스가 공통적으로 공유할 불변식을 정의하기 어렵다. * 기본적인 구현 방법? 원시 명령을 상위 클래스의 "protec..
[디자인 패턴] #9_업데이트 패턴, Update Pattern 게임 디자인 패턴 중 "순서 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 10 항목, "업데이트 메서드"에 해당하는 내용입니다. 업데이트 패턴 1. 개념 * 개념 : 객체 컬렉션에 들어 있는 객체별로 한 프레임 단위의 작업을 진행하라고 "알려줘서" 전체를 시뮬레이션한다. 2. 왜? // 메인 게임 루프 while(true) { //... // 몬스터 객체의 이동 거리 업데이트 if(bMonsterLeft == true) { x--; if(x == 0) bMosterLeft = false; }else { x++; if(x == 100) bMonsterLeft = true; } // 이동 거리 결과 업데이트 Monster.setPo..
[디자인 패턴] #8_게임 루프, Game Loop Pattern 게임 디자인 패턴 중 "순서 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 9 항목, "게임 루프"에 해당하는 내용입니다. 게임 루프 1. 사용 목적 * Why? : 게임 시간 진행을 유저 입력과 프로세서의 속도와 디커플링 합니다. 2. 개념 사용자 입력을 기다리는 동안 루프가 계속 돌며 게임을 진행합니다. 루프가 얼마나 빠르게 돌았는지에 따라서 "FPS"가 측정되며, 어떠한 플랫폼에서도 일정한 속도를 유지하는 것이 주요합니다! 코드 예제 1. 게임 루프의 기본 형태 while(true) { processInput(); update(); render(); } 1. 사용자 입력 처리 2. 상태 업데이트 3. 화면에 그려내기 * 주..
[디자인 패턴] #7_이중 버퍼, Double Buffer 게임 디자인 패턴 중 "이중 버퍼 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 8 항목, "이중 버퍼"에 해당하는 내용입니다. 이중 버퍼 1. 개념 * 이중 버퍼 패턴? : 어떠한 클래스는 변경이 가능한 상태를 캡슐화합니다. 해당 상태는 지속적으로 변경되지만, 외부에서 볼 때 한 번에 변경되는 것처럼 보이게 하고 싶습니다. 따라서, 해당 클래스를 "현재" 상태와 "다음" 상태를 갖도록 합니다! 이때, "현재" 상태는 항상 "읽기" 전용이며, "다음" 상태는 항상 "쓰기" 혹은 "변경"에 사용됩니다! 2. 그렇다면, 언제? 1. 순차적으로 변경해야 하는 상태가 있을 때 2. 변경 도중에도 접근 할 수 있는 상태가 있을 때 3. 외부에서..