목차
경량 패턴
경량 패턴(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를 사용하여 수천 개의 나무를 생성합니다. 각 나무는 위치와 같은 외부 상태를 가지며, 공통된 모델과 텍스처를 공유합니다.
이 구조를 사용함으로써, 유니티 게임 개발에서 많은 수의 유사한 게임 오브젝트를 효율적으로 관리할 수 있으며, 메모리 사용량을 크게 줄일 수 있습니다.