Search

경량 패턴

class
디자인 패턴
상태
완료
날짜
목차

경량 패턴

경량 패턴(Flyweight Pattern)은 객체 지향 프로그래밍에서 메모리 사용을 최적화하기 위해 사용되는 디자인 패턴 중 하나입니다.
유니티와 같은 게임 개발 환경에서 이 패턴은 특히 유용하며, 많은 수의 유사 객체를 생성할 때 메모리를 절약하는 데 도움이 됩니다.

경량 패턴의 장단점

장점

메모리 효율성 : 많은 수의 유사 객체를 생성할 때 메모리 사용량을 크게 줄일 수 있습니다.
성능 개선 : 메모리 절약으로 인한 성능 향상을 기대할 수 있습니다.

단점

복잡성 증가 : 패턴의 구현이 복잡해질 수 있습니다.
공유 상태 관리 : 공유되는 객체의 상태를 관리하는 것이 복잡해질 수 있습니다.
한 개의 텍스쳐나 모델이 여러 적들에게 공유될 경우, 그 부분을 어떻게 관리할 지에 대한 방법이 필요합니다.
예를 들어, 동일한 텍스쳐를 관리하면서 특정 상황에서는 해당 객체의 텍스쳐 특성만 변경하거나, 다른 공유 텍스쳐로 변경해야 하는 상황에서 이 부분에 대한 고려가 필요합니다.

경량 패턴의 구조

1.
Flyweight 인터페이스 : 모든 경량 객체가 구현해야 하는 인터페이스입니다. 공유 상태에 대한 연산을 정의합니다.
2.
Concrete Flyweight : Flyweight 인터페이스를 구현하는 클래스로, 공유 가능한 상태를 저장합니다.
3.
Flyweight Factory : 필요에 따라 적절한 Flyweight 인스턴스를 생성하거나 기존 인스턴스를 반환합니다.
4.
Client : Flyweight 팩토리를 사용하여 Flyweight 객체에 접근하고, 외부 상태를 전달합니다.

경량 패턴의 구현

Flyweight 인터페이스 및 Concrete Flyweight
using UnityEngine; // Flyweight 인터페이스 public interface IFlyweight { void Display(GameObject context, Vector3 position); } // Concrete Flyweight public class TreeModel : IFlyweight { private Mesh mesh; private Texture texture; public TreeModel(Mesh mesh, Texture texture) { this.mesh = mesh; this.texture = texture; } public void Display(GameObject context, Vector3 position) { context.GetComponent<MeshFilter>().mesh = mesh; context.GetComponent<Renderer>().material.mainTexture = texture; context.transform.position = position; } }
C#
복사
Flyweight Factory
using System.Collections.Generic; public class TreeFactory { private Dictionary<string, IFlyweight> flyweights = new Dictionary<string, IFlyweight>(); public IFlyweight GetTree(string type) { if (!flyweights.ContainsKey(type)) { Mesh mesh = LoadMesh(type); // 메쉬 로드 Texture texture = LoadTexture(type); // 텍스처 로드 flyweights[type] = new TreeModel(mesh, texture); } return flyweights[type]; } private Mesh LoadMesh(string type) { /* 메쉬 로드 로직 */ } private Texture LoadTexture(string type) { /* 텍스처 로드 로직 */ } }
C#
복사
Client 코드
using UnityEngine; public class Forest : MonoBehaviour { private TreeFactory treeFactory = new TreeFactory(); void Start() { for (int i = 0; i < 1000; i++) { Vector3 position = new Vector3(Random.Range(-100, 100), 0, Random.Range(-100, 100)); string type = Random.Range(0, 2) == 0 ? "Oak" : "Pine"; IFlyweight tree = treeFactory.GetTree(type); GameObject treeObj = new GameObject("Tree"); tree.Display(treeObj, position); } } }
C#
복사
TreeModel : 공유되는 상태(메쉬와 텍스처)를 저장합니다. 이 클래스는 IFlyweight 인터페이스를 구현하며, Display 메소드를 통해 게임 오브젝트에 메쉬와 텍스처를 적용합니다.
TreeFactory : 요청에 따라 적절한 TreeModel 인스턴스를 생성하거나 기존 인스턴스를 반환합니다.
Forest : 클라이언트 코드에서는 TreeFactory를 사용하여 수천 개의 나무를 생성합니다. 각 나무는 위치와 같은 외부 상태를 가지며, 공통된 모델과 텍스처를 공유합니다.
이 구조를 사용함으로써, 유니티 게임 개발에서 많은 수의 유사한 게임 오브젝트를 효율적으로 관리할 수 있으며, 메모리 사용량을 크게 줄일 수 있습니다.