[디자인 패턴] #2_경량 패턴, Flyweight Pattern
게임 디자인 패턴 중 "명령 패턴(Command Pattern)"에 대해 알아보겠습니다.
"게임 프로그래밍 패턴"의 3 항목, "경량"에 해당하는 내용입니다.
경량 패턴
먼저, 경량 패턴이란 "공유"를 통해 다수의 "소립" 객체들을 효과적으로 지원하는 기법입니다.
경량 패턴의 요지는 "공유"입니다.
다수의 객체 인스턴스들이 공유하는 데이터 값을 한 데 모으고, 이러한 데이터들을 "고유 상태"라고 합니다.
그리고, 각 인스턴스들마다 다른 값을 갖는 나머지 데이터들을 "외부 상태"라고 구분하겠습니다.
경량 패턴은 다수의 인스턴스들이 공유하는 데이터들이 공통적으로 갖는 "고유 상태"를 공유하도록 만들어 효과적으로 메모리 사용량을 줄이도록 합니다!
예제: 지형 정보
class Terrain
{
public:
Terrain(int _movementCost, bool _isWater, Texture _texture)
: movementCost(_movementCost), isWater(_isWater), texture(_texture)
{}
int GetMovementCost() const { return movementCost; }
bool IsWater() const { return isWater; }
const Texture& GetTexture() const { return texture; }
private:
int movementCost;
bool isWater;
Texture texture;
};
게임 World의 지형 정보를 담고 있는 클래스를 예제로 살펴보겠습니다.
지형 정보 클래스는 이동 소요시간(Movement Cost), 물인지 여부(Is Water), 그리고 텍스쳐 정보(Texture)를 데이터 멤버로 갖고 있습니다.
여기서 주목해야할 점은 지형 정보를 반환하는 메서드들 모두 const로 정의되어 있다는 점입니다.
그 이유는 Terrain 객체를 여러 곳에서 공유하기 때문에, Terrain 멤버의 정보가 변경 또는 삭제되는 것을 방지해야 합니다!
Terrain 클래스 내부에 "위치 정보"가 없는 것을 확인하셨나요?
각 타일들의 위치 정보는 "고유 상태"가 아니라, "외부 상태"이기 때문이죠!
추가적으로, 우리는 각 타일(x, y)마다 Terrain 인스턴스를 생성하는 비용은 피하고자 합니다.
따라서, 우리는 Terrain 객체를 직접적으로 선언하거나 열거형을 사용하기보다, Terrain 객체를 가리키는 포인터를 사용해보겠습니다.
class World
{
public:
World()
: grassTerrain(1, false, GRASS_TEXTURE),
hillTerrain(3, false, HILL_TEXTURE),
riverTerrain(2, true, RIVER_TEXTURE)
{}
pulbic:
void GenerateTerrain();
void GetTile(int x, int y) const;
//...
private:
Terrain grassTerrain;
Terrain hillTerrain;
Terrain riverTerrain;
private:
Terrain* tiles[Width][Height];
int Width;
int Height;
//...
}
void World::GenerateTerrain()
{
for(int x=0; x<Width; x++)
{
for(int y=0; y<Height; y++)
{
if(random(10) == 0) // Hill 생성
tiles[x][y] = &hillTerrain;
else // Grass 생성
tiles[x][y] = &grassTerrain;
}
}
// River 생성
int x = random(Width);
for(int y=0; y<Height; y++)
tiles[x][y] = &riverTerrain;
}
풀(grassTerrain), 언덕(hillTerrain), 그리고 강(riverTerrain) 등의 세 가지 대표적인 지형들을 "고유 상태"로 가정하고 각 지형 인스턴스들이 공유합니다.
그리고, 각각의 지형 타일들( tiles[Width][Height] )은 세 가지중 해당되는 지형을 가리키는 포인터 형식으로 저장됩니다.
'언어 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴]#6_상태 패턴, State Pattern (1) | 2022.08.20 |
---|---|
[디자인 패턴]#5_싱글턴 패턴, Singleton Pattern (0) | 2022.08.02 |
[디자인 패턴]#4_프로토타입 패턴, Prototype Pattern (0) | 2022.07.22 |
[디자인 패턴]#3_관찰자 패턴, Observer Pattern (0) | 2022.07.15 |
[디자인 패턴]#1_명령 패턴, Command Pattern (0) | 2022.07.07 |