프로그래밍/Unity

NGUI 스크롤 느려지는 현상 (재사용리스트를 사용하지 않고 기능 개선)

InTheStorm 2016. 1. 14. 12:57
반응형
SMALL

NGUI로 스크롤 을 구현하다보면 Grid를 사용하는 것이 일반적인데, 


아이템이 많아지면 느려지는것을 자주 보게 된다. 


아이템이 많아지니까 느려지는것은 어찌보면 당연한 일이다.


하지만 그대로 사용할수없으니 해결을 해야지 ㅜ 


그래서 나온것이 재사용 리스트를 사용하는 것이다. 보여지는 아이템과 스페어 아이템을 미리만들어놓고 위치와 내용을 바꿔가며 사용하는 재사용 리스트!! 를 만드는 방법은 이미 다른 블로그에도 많이 소개하고 있으니 패스!!


재사용리스트로 제대로 구조를 잡아가며 만들생각을 하신분은 아마도 이 내용을 검색하지 않았을 것이다.


이미 NGUI 구조로 스크롤을 만들었는데, 사용하다보니 아이템이 많은경우가 생기고, 그럴때 느리더라 하는 경우일 것이다.



어쩃든 시간은 급하고 빨리 처리는 해야하는 급박한 상황에 있는 분...

그런 분들을 위하여 꼼수...를 하나.




NGUI 소스를 고쳐보자


NGUI의 UIWidget 의 visibleByPanel( ~~~ ) 을 찾는다 


부모로 둔 패널의 변화에 따라 해당위젯(라벨,스프라이트,텍스쳐 .... 모두 해당된다 )이 활성 비활성화 되는 함수다.


패널이 꺼지면 자식 위젯들이 모두 꺼지는 그런 기능이라고 보면된다.


우리가 사용하는 스크롤뷰 역시 패널의 소프트 클립이라는 형태로 아이템들을 컷하고 있다. 


아이템을 컷할때 영향을 받아서 visibleByPanel 에 들어간다.



빨간부분을 추가한다.

BoxCollider mParentCol = null;


public bool UpdateVisibility (bool visibleByAlpha, bool visibleByPanel)

{

if (mIsVisibleByAlpha != visibleByAlpha || mIsVisibleByPanel != visibleByPanel)

{


mParentCol = transform.GetComponent<BoxCollider>();

if( mParentCol != null )

{

if (mIsVisibleByAlpha != visibleByAlpha)

mParentCol.enabled = visibleByAlpha;

if(mIsVisibleByPanel != visibleByPanel)

mParentCol.enabled = visibleByPanel;

}



mChanged = true;

mIsVisibleByAlpha = visibleByAlpha;

mIsVisibleByPanel = visibleByPanel;

return true;

}

return false;

}

  

<↑3.8 버전 >


BoxCollider mParentCol = null;


public bool UpdateVisibility (bool visible)

{

if (mIsVisible != visible)

{

mParentCol = transform.GetComponent<BoxCollider>();

if( mParentCol != null )

mParentCol.enabled = visible;


mChanged = true;

mIsVisible = visible;


return true;

}

return false;

}

<↑3.0 버전 >



다른버전들도 비슷하게 고치면된다.

**주의할 점이라면 위 소스는 해당 위젯에 콜라이더가 붙어있을경우를 예상하고 처리한 것이다.

당신의 스크롤에 부모게임오브젝트에 콜라이더 처리를 하고 스프라이트를 하위로 넣는 형태의 아이템을 사용했다면

위 소스에서

mParentCol = transform.GetComponent<BoxCollider>(); 

=>  mParentCol = transform.parent.GetComponent<BoxCollider>();

같은 형식으로 콜라이더를 찾아주어야 할것이다.


처리는 끝이다(그냥 검색으로 빠르게 기능개선만 해보려던분은 창을 닫으면된다.)







개선 원리는 간단하다.


어떤 프로그램이든 특정상황에 느려지는건 그 상황에 데이터처리가 많아서다.


그리고 처리를 가장 많이 잡아먹는건 드로우처리 와 충돌처리 다


현재 상황은 NGUI에서 패널이 소프트 클립으로 알파를 이용해서 드로우처리를 줄이는 작업은 스스로 해주고있다.


하지만 아이템에 붙어있는 콜라이더들은 처리를 해주지 않는다. (이것이 늘어날수록 계산량이 많아지면서 느려진다...)  


그래서 위 소스는 위젯의 활성화를 NGUI에서 처리할때 빌붙어서 콜라이더를 가지고 있다면 그것도 꺼주도록 처리한 것이다.


재사용리스트만큼 빨라지진 않아도 프로그램을 못 돌릴만큼 느려지는 현상에서는 해방되었다.


아직 소스를 안 짠 상황이라면 재사용리스트를 써라..



 







반응형
LIST