본문 바로가기

관리 메뉴

[Unity] NGUI Atlas Save Batching, Draw call 본문

프로그래밍/ㄴ이슈

[Unity] NGUI Atlas Save Batching, Draw call

최갓 2021. 8. 3. 17:38
반응형

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에 맞게 잘 정렬해주어야 인스턴싱이 된다. 

반응형
Comments