반응형

Flyweight Pattern 이란?

플라이웨이트 패턴Flyweight Pattern은 같거나 비슷한 객체들이 공유하는 데이터들을 가능한 많게해서 메모리 사용량을 최소화하는 디자인 패턴입니다. 대표적으로 자바에서 String Pool이 Flyweight pattern의 예시로 나오는데, 게임에서는동일한 몬스터를 여러마리 생성하는 등 비슷하거나 같은 객체를 많이 생성해야 할 때 이 패턴을 쓰는 것이 좋습니다.

유니티 스크립트상에서 구현하려면 하나의 클래스에 공유되는 데이터 필드나 매서드를 작성하는 것으로 구현할 수 있는 간단한 패턴입니다.

 

유니티에서 Flyweight Pattern 예시와 활용법

MyFlyweight 객체들이 공유하는 데이터를 아래와 같이 SharedData 클래스로 정의해두었습니다.

public class MyFlyweight
{
    private int individualInteger;
    
    private SharedData data;
    
    public MyFlyweight(Data data, int individualInteger)
    {
    	this.individualInteger = individualInteger;
    	this.data = data;
    }
}

public class SharedData
{
    private double someDoubleNumber = 9999d;
    private string someString = "abcdefghijklmnop";
    //... lots of shared data
}

이제 유니티에서 MyFlyweight 객체를 1만개를 생성해 보겠습니다. 

public class MyFlyweightController : MonoBehaviour
{
    private List<MyFlyweight> myFliyweights = new List<MyFlyweight>();
    
    void Start()
    {
    	int numberOfObjects = 10000;
        SharedData sharedData = new SharedData();
        
        for(int i=0; i<numberOfObjects; i++)
        {
            MyFlyweight myFlyweight = new MyFlyweight(sharedData);
            myFlyweights.Add(myFlyweight);
        }
    }
}

이러한 패턴은 유지보수 관점에서 코드 퀄리티의 장점도 물론 있습니다. 그러나 SharedData가 크면 클수록 numberOfObjects가 많으면 많을수록 Flyweight Pattern가 보여주는 성능상의 이점은 더욱 부각될 것입니다. 유니티 씬에 객체가 매우 많다면 대체로 공통된 속성들이 있는 객체들일 것이며 이 패턴을 반드시 적용해야 할 것입니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기