일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- trie
- Unity
- two pointer
- level3
- Gold
- dirtyflag pattern
- algorithm
- BFS
- knapsack Problem
- LEVEL2
- Zenject
- Flyweight Pattern
- Modern C++
- level1
- 8-Puzzle
- 3D RPG
- 프로세스 상태
- Bronze
- Euclidean
- Project
- effective C++
- Silver
- binary search
- BOJ
- programmers
- stack
- PrefixSum
- solid 원칙
- SWEA
- 프로그래머스
- Today
- Total
Patrick's Devlog
[Unity] Flyweight Pattern 본문
Flyweight Pattern
다른 패턴과 다르게 메모리 절약 등 성능 및 최적화에 초점을 맞춘 패턴이다. 여러 객체들이 리소스 공유를 통해 이들을 효율적으로 지원하는 패턴이다.
예를 들어 복제된 여러 GameObject가 씬에 존재할 때, 각 개별 필드는 상대적으로 작을 수 있으나 다양한 구성 요소와 저장된 데이터 필드(예 : 구조체, 배열 등 Value Type 유형)도 복사된다. 이러한 부분을 해결하기 위해 Scriptable Object를 사용하면 해결된다.
유니티에서 Flyweight Pattern을 사용한다고 하면 Scriptable Object를 사용한다고 생각하면 된다. Scriptable Object의 궁극적인 목표는 공유된 데이터는 데이터로서만 지니고 있고 여러 오브젝트가 참조한다. 이러한 목표에 대해 Flyweight Pattern의 목적과 동일하다.
예시
리팩토링 되지 않은 코드가 있다고 예를 들자
public class UnrefactoredUnitInstance : MonoBehaviour {
// 인스턴스가 달라도 동일한 변수 정보
// 인스턴스마다 복제됨
public string factionName;
public Sprite factionIcon;
public int baseHealth;
public int baseAttack;
public int baseDefence;
public int baseMovement;
// 인스턴스마다 다른 변수 정보
public int health;
public int attack;
public int defence;
public int movement;
public Vector3 position;
private void Start() {
RefreshunitStats();
}
private void RefreshUnitStats() {
health = baseHealth;
attack = baseAttack;
defense = baseDefense;
movement = baseMovement;
}
public void SetFactionData(string factionName, Sprite factionIcon, int baseHealth,
int baseAttack, int baseDefense, int baseMovement) {
this.factionName = factionName;
this.factionIcon = factionIcon;
this.baseHealth = baseHealth;
this.baseAttack = baseAttack;
this.baseDefense = baseDefense;
this.baseMovement = baseMovement;
RefreshUnitStats();
}
}
하나의 클래스에 이렇게 정보를 기입하면 인스턴스마다 달라야 하는 변수는 상관없으나 기본적인 객체의 정보는 모두 복제되므로 좋은 코드가 되지 않는다. 이를 ScriptableObject로 변수 정보를 저장하면 아래의 코드와 같다.
[CreateAssetMenu]
public class FactionData : ScriptableObject {
public string factionName;
public Sprite factionIcon;
public int baseHealth;
public int baseAttack;
public int baseDefence;
public int baseMovement;
}
// ---
public class UnitInstance : MonoBehaviour {
public FactionData factionData;
private void Start() {
RefreshunitStats();
}
private void RefreshUnitStats() {
health = factionData.baseHealth;
attack = factionData.baseAttack;
defencse = factionData.baseDefense;
movement = factionData.baseMovement;
}
public int health;
public int attack;
public int defense;
public int movement;
public Vector3 position;
}
이렇게 구현하게되면 인스턴스별로 달라야하는 값들은 메모리에 인스턴스당 1개씩 저장되고, 공통적으로 저장되는 FactionData는 메모리의 하나만 저장된다. Flyweight Pattern은 코드도 간결해지고 메모리도 절약할 수 있다는 장점이 존재한다.
참고 문서
[유니티 TIPS] 대량의 인스턴스가 가진 속성을 최적화하는 Flyweight 패턴 | 프로그래밍 디자인패턴
'Unity > Design Pattern' 카테고리의 다른 글
[Unity] DirtyFlag Pattern (0) | 2024.10.15 |
---|---|
[Unity] Strategy Pattern (2) | 2024.10.10 |
[Unity] MVC, MVP, MVVM Pattern (1) | 2024.10.08 |
[Unity] Singleton Pattern (1) | 2024.10.04 |
[Unity] Object Pool Pattern (0) | 2024.10.03 |