경량 패턴이란?
같은 객체를 여러개 표현할 때, 고유 데이터는 공유하여 사용하는 패턴입니다. 기본적인 Call by reference의 개념 구조입니다. 객체를 여러개 표현하지만, 내부적으로는 참조 데이터 하나로 사용하는 개념이라고 할 수 있겠습니다.
특징
고유 데이터의 경우, 내부적으로 공유하는 데이터가 사용되기 때문에, 여러개의 객체를 표현해도 객체 개수보다 사용되는 메모리가 적습니다.
예제
Tree.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tree : MonoBehaviour
{
private static MeshRenderer _treeMeshRenderer = null;
private static MeshRenderer TreeMeshRenderer
{
get
{
if (_treeMeshRenderer == null)
_treeMeshRenderer = Resources.Load<MeshRenderer>("Low Poly Tree/TREE");
return _treeMeshRenderer;
}
}
private static Material[] _materials = null;
private static Material GetMaterial()
{
if (_materials == null)
{
_materials = Resources.LoadAll<Material>("Low Poly Tree/Materials");
}
return _materials[Random.Range(0, _materials.Length)];
}
#region Inspector
public GameObject mesh;
#endregion
private void Awake()
{
MeshRenderer meshRenderer = mesh.AddComponent<MeshRenderer>();
meshRenderer.material = GetMaterial();
MeshFilter meshFilter = mesh.AddComponent<MeshFilter>();
meshFilter.mesh = TreeMeshRenderer.GetComponent<MeshFilter>().sharedMesh;
// Set Size
this.transform.localRotation = Quaternion.Euler(new Vector3(-90f, 0f, 0f));
this.transform.localScale = new Vector3(10f, 10f, 10f);
}
}
예제 설명
static 변수로 공유 데이터를 Load하여, 이후에는 Tree오브젝트가 랜더러 데이터를 공유하여 사용합니다.
고유 데이터: Tree Renderer (Mesh, Material)
개별 데이터: 각 객체의 위치값 (Transform)
게임 엔진을 사용하고 있다면?
유니티 기준 인스펙터 상단 'static' 토글 버튼이 있습니다. 이는 Static batching이라는 개념의 움직이지 않고 정적 요소들을 하나의 그룹으로 만들어서 DrawCall을 줄여주는 역할을 하고 있습니다. 이 역시 경량 패턴 개념으로 하나의 자원을 같이 쓰도록 설계 되어있습니다. 우리는 대체적으로 하나의 맵을 만들 때, 프랍들을 같이 static 체크하여 하나의 패키징으로 만들어 사용하고 있습니다.
기본적으로 게임 엔진에서는 이러한 기능을 제공하고 있으며, 다른 엔진을 사용하신다면 먼저 알아보는 것이 좋겠습니다.
정리
게임 엔진을 사용한다면, 먼저 관련 기능이 이미 지원하고 있는지 확인이 먼저 필요합니다. 이번 글에서는 이러한 기술이 있구나라는 것을 알아두면 좋겠다고 생각합니다.
구글링으로 알아본 경량 패턴 죄다 글만 긁어오고 왜 본인들이 테스트를 하지 않고, 똑같은 글들만 무수히 많을까요? 🤣
참고: 유니티 정적 게임 오브젝트 - https://docs.unity3d.com/kr/530/Manual/StaticObjects.html
'Study' 카테고리의 다른 글
Unity, ScriptableObject 사용 예제 (2) | 2022.02.02 |
---|---|
디자인 패턴, Singleton Pattern (단일 인스턴스 패턴) (0) | 2022.01.31 |
디자인 패턴, Observer Pattern (관찰자 패턴) (0) | 2022.01.29 |
디자인 패턴, Build Pattern (생성 패턴) (2) | 2022.01.22 |
C#, 일반적인 Cast와 is, as 키워드 그리고 퍼모먼스 (0) | 2022.01.13 |
댓글