[Unity] NGUI Atlas Save Batching, Draw call 본문
NGUI의 Atlas를 이용하여 UI작업을 하는 중
UI의 Batches가 과하게 높은 문제를 발견했다.
Frame Debugger를 통한 확인 결과, 동일한 아틀라스에서 여러번의 draw call을 잡아먹고 있는 것을 발견했다
위 사진을 보면 BaseUIAtlas2와 같이 동일한 Atlas가 여러번 호출되는 것이 보이는가?
이 상황을 해결하기 위해선 다음과 같은 처리가 필요하다.
1. 각 Panel의 뎁쓰는 가능한 중복되지 않게 해야한다.
2. Panel안 UI Object들의 Depth를 아틀라스에 따라 정렬 해주어야 한다.
이 2번 방법에 대해 자세히 설명하겠다.
Depth 10을 가지는 Panel이 있다고 가정하고,
이 Panel안에 7개의 UI 객체가 있다고 가정하자.
각각 UI객체의 아틀라스 참조는 다음과 같다.
A,B,C 는 Atlas1을
D는 Atlas2를
E,F,G는 다시 Atlas1을 사용한다
이 경우 위 UI객체의 Depth를 모두 동일하게 하거나, 정렬되지 않은 경우 최대 7의 Draw Call이 발생할 수 있다
이를 방지하기 위해서는 같은 Atlas를 사용하는 UI객체의 Depth는 정렬되게 세팅해 주어야 한다는 것이다.
A,B,C 객체의 Depth를 각각 1,2,3 로 설정해주고, D는 4로, E,F,G를 5,6,7로 세팅해준다면 어떻게 될까?
총 3의 Draw Call이 발생한다.
이유는 Atlas1의 인스턴싱은 다른 Atlas를 사용하는 D를 만나는 순간 일단 묶여, 끊기게 되고, 다시 D를 한번 Draw한 후
E,F,G를 인스턴싱 하기 때문이다
2개의 아틀라스를 사용하는 UI를 단 2의 Draw call로 인스턴싱 되게 하기 위해선
A,B,C의 Depth를 1,2,3으로, E,F,G의 Depth를 4,5,6으로 설정한 후 D를 7로 세팅해주면 된다.
결론 : Panel내의 오브젝트 Depth가 겹치지 않도록 하며, 공유하는 Atlas에 맞게 잘 정렬해주어야 인스턴싱이 된다.
'프로그래밍 > ㄴ이슈' 카테고리의 다른 글
[Unity] Google 다중 로그인, 계정 변경 (0) | 2021.12.07 |
---|---|
[Unity] Google 'returning an error code'. 로그인 문제 (1) | 2021.12.07 |
[Unity] Light Bake Broken Error. 라이트닝 맵핑 깨짐 문제 (2) | 2021.07.06 |
[Unity] APP CRASHES DURING LAUNCH WITH "USING MEMORYADRESSES FROM MORE THAN 16GB OF MEMORY" (0) | 2021.02.25 |
[Android/GPGS] Google Login/OAuth Infinite loop/loading (0) | 2021.01.26 |