[게임 프로그래밍 패턴] 2. 경량 패턴

WIGWAG·2023년 2월 13일

경량 패턴이란?

공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다. (GoF의 디자인 패턴 265p)

많은 객체가 사용하는 공통된 데이터나 속성을 하나의 클래스로 묶고 이 클래스를 많은 객체가 공유하도록 만들어서 데이터 크기를 줄이는 기법이다. 그래픽이 높은 게임에서 자주 사용되는 패턴으로 GPU로 전달되는 데이터를 줄여서 GPU의 부담을 덜어준다.


경량 패턴 예시 코드

#include <iostream>

using namespace std;

enum C_Texture{
	GRASS_TEXTURE,
	HILL_TEXTURE,
	RIVER_TEXTURE
};

class C_Terrain {
public:
	C_Terrain(int movement_cost, bool is_water, C_Texture texture)
		:movement_cost_(movement_cost), is_water_(is_water), texture_(texture) {}

	int Movement_Cost() const { return movement_cost_; }
	bool Is_Water() const { return is_water_; }
	C_Texture Get_Texture() const { return texture_; }

private:
	int movement_cost_;
	bool is_water_;
	C_Texture texture_;
};

class C_World {
public:
	C_World()
		:grass_terrain_(1, false, GRASS_TEXTURE),
		hill_terrain_(3, false, HILL_TEXTURE),
		river_terrain_(2, true, RIVER_TEXTURE) {}

	void Generate_Terrain();
    
	const C_Terrain& Get_Tile(int x, int y) { return *tiles_[x][y]; }

private:
	static const int WIDTH = 3;
	static const int HEIGHT = 3;
	C_Terrain* tiles_[WIDTH][HEIGHT];

	C_Terrain grass_terrain_;
	C_Terrain hill_terrain_;
	C_Terrain river_terrain_;
};

void C_World::Generate_Terrain() {
	tiles_[0][0] = &hill_terrain_;
	tiles_[0][1] = &hill_terrain_;
	tiles_[0][2] = &hill_terrain_;

	tiles_[1][1] = &grass_terrain_;
	tiles_[1][1] = &grass_terrain_;
	tiles_[1][2] = &grass_terrain_;

	tiles_[2][0] = &river_terrain_;
	tiles_[2][1] = &river_terrain_;
	tiles_[2][2] = &river_terrain_;
}

int main()
{
	C_World world;
	int cost = world.Get_Tile(1, 2).Movement_Cost();
}
profile
프로그래밍 공부 기록 노트

0개의 댓글