버그 해결을 위한 모든 질문을 던져
0 votes
329 views
NGUI 사용시 Widget의 gameobject를 껏다 켰다 반복시 일어나는 비용 절감을 위한 방법은 어떤것이 있나요?

게임내에서 UI를 사용시 예를들어 버프 아이콘이 수없이 붙었다 떨어졌다를 반복할때 오브젝트를 껏다 켰다 해주면 내부에서는 해당위젯이 패널에 add remove를 반복하면서 해당 패널 하위에 붙은 모든 위젯을 fillalldrawcall 을 실행하게 되어 퍼포먼스가 좋지 못한걸 볼 수 있습니다. 최적화 해보신 분들은 이런 부분은 어떻게 해결을 보셨나요?? 그냥 적절히 패널을 나누어서 사용하시나요? 유닛이 많이 나오면 이런 정보창도 많아져서 빈도도 훨씬 많이 져서 고민입니다.

제가 해본것은 두가지 정도인데 gameobject의 SetActive가 아닌, 포지션과 스케일 입니다.

On / Off 일때 각각 화면밖으로 멀리 보내거나, 스케일을 0로 만드는 것인데 둘다 사이드 이펙트가 발생하여 사용은 하지 못할 듯 보입니다. 좋은 방법이 있을까요?
asked (2 point) , 329 views

3 answers

0 votes
자주 렌더링 상태가 바뀌어야 하는 경우, Renderer만 Toggle 해도 될 것 같습니다.

NGUI를 사용하지 않아 적합한 방법인지는 모르겠습니다.
answered (4 point)
0 votes
알파값을 0으로 만들면 어떤지요?
answered (55 point)
아쉽지만 위젯 알파를 0으로 할경우 내부 코드에서 똑같이 disabled 처리를 합니다....
0 votes
1. 그냥 쓴다.

2. alpha 값을 조절하여 보이게 안보이게 한다.

3. 위치를 화면밖으로 이동시킨다.

4. 해당 drawcall 의 meshrenderer를 껏다 켠다.

5. ngui를 마개조 하여 drawcall pooling 시스템을 만든다.

6. 커스텀 UI를 만든다.

7. 수제 Shader로 해결한다.
 
8. 스케일이나 회전으로 안보이게 헌다.

저는 1번 할거 같네여 'ㅡ'

근데 쓰고보니... 버프아이콘들은 공통된 아틀라스에 들어있고 한개의 드로우콜로 그리는 구조겠죠?
answered (4 point)
수정됨
2번은 똑같이 panel에서 remove하는 작업을 합니다.

3번은 UI특성상 화면밖을 나가지 못하게 처리를 해놔서.... 안될것 같습니다.

4번은 uisprite라 meshrenderer가 없습니다.

5번은 ngui 자체 drawcall 관리를 위한 리스트가 존재합니다.

6번은 이미 서비스 중인 게임이라 선택할 수 없습니다.

7번은 음... 이건 아닌것 같습니다.

8번은 스케일로 처리를 해보았으나 신통치 않았습니다.

 

지금은 적당히 패널을 나누어서 조금 나아진 상황입니다만. 아직 성에 차진 않네요....

NGUI 많이 사용하고 최적화 해본분이 있을까하여 질문했습니다.
2. remove 하지 않을 정도의 alpha 값을 사용합니다. 눈에는 안보이지만 remove 하지 않을 정도의 값(0이 아닌 0.05라던가...정확한 수치는 아닙니다. 기억이 안나서.)

4. uisprite 를 draw하는 drawcall 객체를 보시면 meshrenrer가 있습니다. 다만 한개의 drawcall이 모두를 관리하면 어쩔수 없습니다.

5. 자체 drawcall을 관리하는부분을 수정해서 drawcall을 다시 생성하지 않고 기존에 생성한넘을 재활용해봅니다.

6. 전체는 힘들고 그 부분만 담당하는 ui를 만들어 봅니다. 버프 아이콘만 담당하는 UI.

7. 기획여부에 따라 안될수도 있을것 같습니다. 다만 별다른 기능이 없다면, 입력되는 값에 따라 아틀라스 일부를 띄엄띄엄 가져와 순차적으로 출력하는 섀이더를 연구해 봅니다.

 

많이 생각했는데 부족한 답변이라 죄송합니다.ㅜ

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

238 질문
366 answers
375 댓글
467 users