GoF의 디자인 패턴에 기록된 정의는 "공유를 통해 많은 수의 소립객체들을 효과적으로 지원합니다." 입ㄴ디ㅏ.
경량 패턴을 왜 사용하는지 알아보기 위하여 숲을 구현하는 것을 예시로 알아보겠습니다.
숲을 구현한다 라는 문장은 수 많은 나무들이 존재하는 숲을 구현한다 라는 뜻이고 그래픽스 프로그래머는 1초에 60번씩 GPU에 전달해야 하는 수백만 개의 폴리곤이 있습니다. 또한 전체 데이터를 CPU에서 GPU로 버스를 통해 전달을 해야합니다.
간단하게 나무에 대한 Class를 제작해보면
class Tree{
private:
Mesh mesh;
Texture bark;
Vector Position;
double heigth;
double thickness;
Color barkTint;
};
와 같은 방식으로 구현할 수 있습니다.
Tree 하나에 들어가는 데이터가 많으며, 메시와 텍스처의 크기도 크기때문에 숲 전체를 1프레임에 GPU로 모두 전달하는 것은 쉽지 않습니다.
이 문제를 해결하기 위하여 Tree 인스턴스가 참조할 공유 객체 TreeModel을 제작하여 공통적인 데이터를 처리하는 방식을 고를 수 있습니다.
class TreeModel{
private:
Mesh mesh;
Texture bark;
};
class Tree{
private:
TreeModel* model;
Vector Position;
double heigth;
double thickness;
Color barkTint;
};
와 같은 방식으로 정리 할 수 있습니다.
GPU에 보내는 데이터 양을 최소화하고 공유 데이터 TreeModel을 한 번 초기화하면 됩니다.
이러한 방식을 인스턴스 렌더링(instanced rendering)이라고 합니다.
인스턴스 렌더링은 Direct 3D, OpenGL에도 지원을 하는 기능으로 데이터 스트림을 두 가지 요구합니다.
1. 메시, 텍스쳐 등 여러 번 렌더링이 필요한 공유 데이터
2. 1번 데이터 스트림을 통해 렌더링할 때 각기 다르게 보이기 위한 매개변수
인스턴스 렌더링의 경우 GPU 버스로 보내는데 걸리는 시간을 단축시키는 것이 중요하지만 기본 개념은 경량 패턴과 비슷합니다.
경량 패턴은 어떤 객체의 개수가 너무 많을 때, 조금 가볍게 만들기 위해 사용합니다.
경량 패턴은 객체 데이터를 두 종류로 구분합니다.
1. 모든 객체 데이터 값이 같아 공유할 수 있는 데이터 -> GoF에서는 고유 상태라고 명칭합니다.
2. 인스턴스 별로 값이 다른 데이터 -> 외부 상태라고 명칭합니다.
사용 방법은 앞의 숲을 제작하는 법과 같이 한 개의 고유 상태를 다른 객체에서 공유하여 메모리 사용량을 줄입니다.
경량 패턴은 객체를 많이 늘리지 않으면서도 객체 지향 방식의 장점을 취할 수 있습니다. Switch를 통한 다중 선택 구문을 제작할 경우 경량 패턴을 고려하는 것도 괜찮다.
'게임 디자인 패턴' 카테고리의 다른 글
명령(Command) 패턴 (0) | 2024.06.05 |
---|