관리 메뉴

기억을 위한 기록들

[GPP]경량 패턴 본문

디자인 패턴 ( Design Pattern )/게임프로그래밍 패턴

[GPP]경량 패턴

에드윈H 2023. 1. 29. 22:51

최초 작성 : 2020년 3월23일

1차 수정 : 2023년 1월 29일

 

경량패턴

이름에서도 알 수 있듯이 경량패턴은 어떤 객체의 개수가 너무 많아서 좀 더 가볍게 만들고 싶을 때 사용.

 

인스턴스 렌더링에서는 메모리 크기보다 렌더링할 나무 데이터를 하나씩 GPU버스로 보내는데 걸리는 시간이 중요하지만, 기본 개념은 경량 패턴과 같다.

 

이런 문제를 해결하기 위해 경량 패턴은 객체 데이터를 두 종류로 나눔.

1. 고유상태(or 자유문맥) : 메시(나무 형태), 텍스쳐 등 해당

2. 외부상태 : 위치, 크기, 색 등

즉, 한개의 고유 상태를 다른객체에서 공유하게 만들어 메모리 사용량을 줄일 수 있다.

 

ex) 한그루의 나무 클래스를 만들어 숲을 만들어야한다.

 

나무 객체에 들어 있는 데이터 대부분이 인스턴스별로 다르지 않으므로, 위의 Tree를 반으로 쪼개어 이런점을 명시적으로 모델링 가능하다. 모든 나무가 다 같이 사용하는 데이터를 뽑아보자.

먼저 나무 메시 자체와 텍스쳐는 다 동일하게 사용 된다는 가정에서 TreeModel 클래스가 만들어졌다.

 

그외에 나무 위치,크기,색 등 만 인스턴스별로 다른 상태 값만 남겨둔다.

 

 

위의 Tree와 TreeModel의 예는 깔끔하게 분리되어 명확해보이지 않는다.

 

 

추가 예로 "지형"이다

 

우선 지형을 예로 들자면,

 

풀, 언덕, 강 지형으로 3가지 예를 들었다.

 

관련하여 만든 함수는 

이 코드 들로 동작하긴 하지만 지저분하다.

이동 비용이나, 땅인지 여부의 관한 하드 코딩이다. 차라리 지형 클래스를 따로 만들자.

 

 

 

하지만 타일마다 Terrain 인스턴스를 하나씩 만드는것도 그렇게 좋진 않다.

위 클래스에서는 타일 위치와 관련된 내용도 없다.

경량 패턴식으로 이야기하자면 모든 지형상태는 '고유'하다

 

 

열거형 대신 포인터를 넣었다.

 

이제 지형 종류가 같은 타일들은 모두 같은 Terrain 인스턴스 포인터를 갖는다.

 

 

Terrain 인스턴스가 이제 여러곳에서 사용되다보니, 동적으로 할당하면 생명주기를 관리하기가 좀 더어렵다. World 클래스에 저장 해준다.

 

 

 

 

원하는 영역의 지형을 적절하게 언덕,풀,강으로 배치해준다.

 

이로써 땅 위를 채울 수 있다.

 

그리고 원하는 지역의 타일 Terrain클래스를 가져오는 getTile 함수를 만들어준다.

이제 지형 속성 값을 World의 메서드 대신 Terrain 객체에서 바로 얻을 수 있다.
World 클래스는 더 이상 지형의 세부 정보와 커플링 되지 않는다. 타일속성은 Terrain 객체에서 바로 얻을 수 있다.

임의로 x=2,y=3의 지역의 이동 비용을 가져올수 있게 된다.

 

 

결론...

경량객체를 한 번은 고려해봐야함-> 해당 패턴을 사용하면 객체를 마구 늘리지 않으면서도 객체지향의 장점을 취할 수 있다....

 

열거형으로 선언해 수많은 다중선택(switch)가 생각난다면, 경량패턴을 고려해보자. 성능이 걱정 된다면, 유지보수하기 어려운 형태로 코드를 고치기전에 프로파일링이라도 먼저 해보자.

 

 

 

 

 

 

-따라해보기-

 

 

 

 

 

플레이어와 무기 클래스를 만들어 위에서 설명한 경량 패턴을 간단하게 따라해보았다.

'디자인 패턴 ( Design Pattern ) > 게임프로그래밍 패턴' 카테고리의 다른 글

[GPP]싱글턴  (0) 2023.02.02
[GPP]상태 패턴  (0) 2023.02.02
[GPP]프로토타입 패턴  (0) 2023.02.02
[GPP]컴포넌트 패턴  (0) 2023.02.02