728x90

1. 경량 패턴 ( Flyweight Pattern ) 정의

  • 데이터의 일부를 다른 개체와 공유하여 메모리 사용을 최소화하는 패턴

 

2. 중복된 데이터가 사용된 예시

// 코드로 표현한 나무
class Tree
{
private:
	FMesh Mesh;
	FTexture Bark;
	FTexture Leaves;
	FVector2D Position;
	double Height;
	double Thickness;
	FColor BarkTint;
	FColor LeafTint;
};
  • 동일한 나무를 그리지만, 메시, 나무껍질, 잎사귀 등 동일한 데이터가 중복돼 있다.

 

3. 중복된 데이터를 공유한 예시

 

// 중복된 데이터
class TreeModel
{
private:
	FMesh Mesh;
	FTexture Bark;
	FTexture Leaves;
};

// 코드로 표현한 나무
class Tree
{
private:
	// 공유된 데이터
	TreeModel* Model;

	FVector2D Position;
	double Height;
	double Thickness;
	FColor BarkTint;
	FColor LeafTint;
};
  • 게임 내 동일한 메시와 텍스처는 한 번만 메모리에 올리면 되기 때문에, TreeModel 객체는 하나만 존재한다.
  • 나무 인스턴스는 공유 객체인 TreeModel을 참조하되, 인스턴스 별로 다른 상태 값만 남겨둔다.
  • 공유할 수 있는 데이터를 고유 상태 ( 메시, 나무껍질, 잎사귀 등 )
  • 인스턴스 별로 값이 다른 데이터를 외부 상태 ( 위치, 색상 등 )라고 부른다.

4. 코드 사용 예시

class Terrain
{
public:
	Terrain( int InMovementCost, bool InIsWater, FTexture InTexture )
		: MovementCost( InMovementCost ), bWater( InIsWater ), Texture( InTexture ) {}

	int GetMovementCost() const { return MovementCost; }
	bool IsWater() const { return bWater; }
	const FTexture& GetTexture() const { return Texture; }

private:
	int MovementCost;
	bool bWater;
	FTexture Texture;
};

class World
{
public:
	World()
		:GrassTerrain( 1, false, GRASS_TEXTURE ),
		 HillTerrain( 3, false, HILL_TEXTURE ),
		 RiverTerrain( 2, true, RIVER_TEXTURE ) {}

	void GenerateTerrain();

	const Terrain& GetTile( int InX, int InY );

private:
	Terrain* tiles[ WIDTH ][ HEIGHT ];

	Terrain GrassTerrain;
	Terrain HillTerrain;
	Terrain RiverTerrain;
};

void World::GenerateTerrain()
{
	for ( int x = 0; x < WIDTH; ++x )
	{
		for ( int y = 0; y < HEIGHT; ++y )
		{
			//if ( 조건1 )
				tiles[ x ][ y ] = &HillTerrain;
			//else if ( 조건 2 )
				tiles[ x ][ y ] = &GrassTerrain;
			//else
				tiles[ x ][ y ] = &RiverTerrain;
		}
	}
}

const Terrain& World::GetTile( int InX, int InY )
{
	return *tiles[ InX ][ InY ];
}
  • 공유할 수 있는 고유 상태는 Terrain 객체로 묶어서 사용했다.
  • 타일을 구성할 때 각각의 Terrain 객체들을 공유해 사용함으로써 메모리를 절약할 수 있다.
반응형

+ Recent posts