DirtyFlag Pattern
오픈 월드와 같이 대규모 환경에서 성능과 메모리 효율을 높이는데 사용되는 디자인패턴이다. 이는 복잡한 씬이나 계층 구조를 관리하면서 필요한 부분만 업데이트하기 위해 사용된다. 이는 플래그가 관리한다.
예시
1) 선택적 로딩 및 언로딩
오픈 월드 게임에서 플레이어가 볼 수 있는 근처 지역만 메모리에 로딩한다. 만약 플레이어가 이동하면 그에 따라 새로운 구역이 실시간으로 로드되거나 언로드 된다.
2) 계층적 씬 업데이트
부모 객체가 변형되면 자식 객체들도 이를 따라 재계산이 필요하다. 하지만 자식 객체가 독립적으로 이동할 경우 이와 같은 계산이 필요 없게 된다. 만약 DirtyFlag패턴을 활용하게 되면 하위 transform은 상위 transfrom에 업데이트를 무시한다. 상태가 자주 변경되는 동적 개체에 대한 불필요한 계산을 최소화한다.
UI요소를 효율적으로 랜더링하기 위해 DirtFlag Pattern이 사용된다.
1. Rebuild와 Dirty Component 오브젝트 재계산
UI는 레이아웃(UI위치)과 그래픽(UI 모양과 외관) 두가지 주요 컴포넌트로 이루어진다. 이를 Dirty Flag를 통해 변경 사항이있는지 확인하여 필요한 부분만 업데이트 하도록한다. 그러므로 불필요한 연산을 줄인다.
2. Batching과 Material
UI가 있는 화면은 Batching 과정을 거쳐 효율적으로 랜더링 된다.
Batching이란?
여러개의 UI 요소를 하나의 묶음으로 만들어 한 번에 랜더링하는 기법이다. 개별 요소를 하나씩 랜더링하면 성능이 저하될 수 있기 때문에 Batching을 통해 GPU에 보내는 명령수를 줄일 수 있다.
3. Batch Building
캔버스가 Dirty 상태로 표시되면 Batching 작업이 다시 진행된다. 과정은 아래와 같다.
1) 그래픽 파이프라인으로 보낼 랜더링 명령 생성 : Batching은 캔버스에 있는 UI요소를 GPU에 전달할 랜더링 명령을 효율적으로 생성한다. 캔버스는 한 번 Dirty 상태가 되어 Batching이 완료되면 캐시를 통해 저장되며 이후에는 같은 명령을 재사용한다.
2) 캔버스 랜더러 컴포넌트 기준으로 계산
캔버스 내의 요소들은 캔버스 랜더러 컴포넌트를 기준으로 처리된다. 하위 캔버스가 포함되지 않는 이유는 하위 캔버스가 별도의 랜더링 그룹으로 처리 되기 때문이다.
3) 배치 계산을 위한 연산
많은 연산을 거친다. 예를 들어 화면에 표시되는 순서를 맞추기 위한 계층별로 정렬, UI요소들이 겹치는지 계산, 같은 머티리어를 사용하는 요소들을 묶는다. 이는 멀티 스레드 연산을 활용해 빠르게 계산된다.
해당 설명의 코드는 아래와 같다.
이 게시글은 https://www.youtube.com/watch?v=6lCrgdLBIGw 을 참고하여 작성하였습니다.
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - Flyweight Pattern(+) ScriptableObject) (0) | 2024.11.09 |
---|---|
Unity - Sprite Library Asset (0) | 2024.11.08 |
Unity - Unity6가 출시되었습니다! (3) | 2024.11.07 |
Unity - AnimationCurve(Lerp보다 더 좋음!) (0) | 2024.10.07 |
Unity - Hold on ( busy for .. ) 무한 로딩 문제 (0) | 2024.07.18 |
댓글