[디자인 패턴] #16_공간 분할 패턴, Spatial Partition 게임 디자인 패턴 중 "최적화 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 20 항목, "공간 분할"에 해당하는 내용입니다. Overview 1. 목적 공격 사정 범위 안에 존재하는 객체들을 찾는 등 주변 객체들을 찾는 작업은 월드 내 객체들을 순회합니다. 월드 내 객체의 개수가 많아질수록, 객체들을 전부 순회하는 작업은 성능 저하의 요인이 될 수 있습니다. 월드 내 주변 객체 탐색 성능을 최적화하기 위해 객체의 "위치 값"에 따라 구성되는 자료구조에 각 객체를 저장합니다. 2. 언제 사용할 것인가? 위치 값을 갖는 객체가 많을 때 위치에 따라 객체 탐색 성능에 영향을 줄 때 3. 주의할 점 객체의 개수가 충분히 많을 ..
언어
[디자인 패턴] #15_객체 풀, Object Pooling 게임 디자인 패턴 중 "최적화 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 19 항목, "객체 풀"에 해당하는 내용입니다. 개념 런타임 중 객체의 할당과 해제를 반복하지 않고, 고정 크기 "풀"에 할당된 객체를 재사용함으로써 메모리 사용 성능을 개선합니다! 왜 필요할까? 1. 메모리 단편화, Memory Fragmentation 메모리 단편화란, 힙에 사용 가능한 공간이 여유로운 크기로 뭉쳐 있지 않고, 작게 조각나 있는 상태를 의미합니다 전체적으로 사용 가능한 메모리 공간이 충분함에도 불구하고, 연속해서 사용 가능한 영역은 작을 수 있습니다. 이때, 메모리 단편화 문제 + 할당/해제 속도 -> 게임 성능을 저하시키는 요인들을 방지..
[Basic C++] #22_참조형 변수 C++ 개발에서 까다로운 문법 혹은 특별한 의미를 갖는 부분에 대해 알아보겠습니다. "전문가를 위한 C"의 10 항목, "C++의 까다롭고 유별난 부분들"에 해당하는 내용입니다. 참조형 변수 "참조형 변수"란 다른 변수에 대한 별명입니다. 참조형 변수, 즉 어떠한 변수에 대한 참조형 변수의 수정 사항은 모두 기존 변수에 반영됩니다. 참조형 변수를 어떠한 변수의 주솟값 추출, 혹은 역참조 연산이 자동으로 수행되는 포인터 변수라고 생각하면 됩니다. * 주의 : &는 주소 값을 의미하기도 합니다. 따라서, "자료형 뒤에 오는 &", 즉 참조인지 잘 확인해야 합니다! 1. 예제 코드 // 참조형 변수의 사용 int x = 5; int& xRef1 = x; // 컴파일 에..
#1. 개념 1. static 키워드static 키워드는 변수 혹은 함수를 내부 링킹을 통해 정의하기 위해 사용됩니다. 더불어, static으로 정의한 변수 혹은 함수는 메모리 구조의 Data 영역에 저장되어 프로그램의 시작과 함께 메모리가 할당되며, 프로그램의 종료 시점에 해제됩니다. static 키워드는 어떤 함수 내 static 변수, 어떤 클래스 내 static 데이터 멤버, 그리고 static 멤버 메서드에 사용됩니다. 2. 링킹C++ 환경에서 소스 파일이 컴파일 되면 목적 파일이 생성됩니다. 그리고, 서로 다른 목적 파일들을 '링킹' 단계에서 하나로 묶어 주어 하나의 실행 파일이 생성됩니다. 이때, 변수나 함수의 이름을 기준으로 목적 파일 안에서 일어나는 변수 참조 혹은 함수 호출 등이 서로 ..
[디자인 패턴] #14_서비스 중개자 패턴, Service Locator 게임 디자인 패턴 중 "디커플링 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 16 항목, "서비스 중개자"에 해당하는 내용입니다. Overview 개요 활용 예제 널 객체 디자인 패턴 데코레이터 패턴 #1. 개요 1. 정의 서비스 중개자 패턴은 디자인 패턴 중 하나로, 다수의 서비스나 컴포넌트가 서로 통신할 수 있도록 '중개자'를 도입하는 방법입니다. 따라서, '서비스 중개자' 패턴은 객체 간의 커플링을 낮추고, 유연성을 향상하며, 유지보수성을 증가시키는데 도움이 됩니다. 2. 왜 필요한가? // 정적 서비스 클래스 AudioSystem::playSound(GUN_SHOT_SOUND); // 싱글턴 디자인 패턴 활용 A..
[Basic C++] #61_객체 풀, Obejct Pooling C++의 "디자인 효율성"에 대해 알아보겠습니다. "전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 객체 풀링 1. 개념 객체가 필요할 때마다 직접 생성하는 것이 아니라, 시작 시점에 한 번만 생성됩니다. 필요할 때마다 객체 풀에 요청하며, 수명이 끝난 객체는 객체 풀에 되돌려 놓습니다. 즉, 객체의 생성자를 매번 필요할 때마다 호출하지 않고, 시작 시점에 미리 준비해 놓습니다. 2. 언제? 프로그램이 구동되는 동안 빈번하게 발생하는 "생성자"와 "소멸자" 호출을 피하기 위한 메커니즘. 개수가 많고, 비교적 수명이 짧은 타입의 객체들의 사용은 "객체 풀" 사용을 고려해야 합니다! 예제 1. 목표 객체들을 ..
[디자인 패턴] #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. 문제..
1. 개념 1. 스마트 포인터C++에서 제공하는 스마트 포인터는 자동 메모리 관리를 제공하는 포인터 클래스입니다. 스마트 포인터는 일반 포인터와 같이 참조/역참조 연산이 가능하며, 가리키는 객체의 수명이 끝나면 자동적으로 메모리 해제를 수행하여 메모리 릭을 방지합니다. 따라서, 사용자는 스마트 포인터 사용을 통해 동적 할당 받은 메모리 영역에 대한 명시적인 해제 작업에 대한 부담 없이 안전하고, 효율적인 코드 작성이 가능합니다. 2. auto_ptr 1. 사용 금지!!!!C++ 11 표준 이전에 제공되던 "auto_ptr"은 심각한 단점을 안고 있습니다. "auto_ptr"은 vector와 같은 STL 컨테이너에서는 정상적을 작동되지 않습니다! 따라서, "auto_ptr"는 사용하지 맙시다! 3. u..
[Basic C++] #59_가비지 컬렉션C++의 "가비지 컬렉션"에 대해 알아보겠습니다."전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 개념가비지 컬렉션은 자동 메모리 관리 기법 중 하나로, 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 식별하고 해제하는 프로세스입니다. 가비지 컬렉션은 자동 메모리 관리를 통해 댕글링 포인터 발생을 방지하고, 편의성을 제공하지만, 런 타임 오버헤드를 유발합니다. 마크 앤 스윕 알고리즘마크 앤 스윕 알고리즘은 가비지 컬렉션의 접근 방법 중 하나로 주기적으로 모든 포인터에 대해 해당 메모리를 참조하여 사용하는 부분이 있는지 검사하여 표시(마크)합니다. 각 검사 주기가 끝날 때마다 표시되지 않은 메모리를 "미사용"으로 취급하여 ..
[디자인 패턴] #12_Component Pattern, 컴포넌트 패턴 게임 디자인 패턴 중 "디커플링 패턴"에 대해 알아보겠습니다. "게임 프로그래밍 패턴"의 14 항목, "컴포넌트"에 해당하는 내용입니다. 개념 1. 의도 한 객체가 여러 분야의 기능들을 "커플링" 없이 다룰 수 있도록 합니다. 복잡한 상속 관계를 통해 여러 기능들을 상속받아 사용하기보다, 각 기능 별 컴포넌트 클래스를 작성하고 해당 클래스 객체를 데이터 멤버로 두어 "디커플링"합니다. 패턴 1. 컴포넌트 패턴 한 객체에 필요한 다양한 분야의 기능들을 별도의 컴포넌트 클래스로 옮겨놓고, 이를 필요로 하는 객체는 단순히 "컴포넌트들의 컨테이너" 역할을 합니다! 2. 왜 필요한가? class Player { public: Player():..