이벤트 시스템이 렉을 유발하다
어느 순간부터 유니티에서 EventSystem.Update()가 엄청난 렉을 유발했다.
원인은 바로 그래픽 레이 캐스터(Graphic Raycaster)였다.
아무 생각 없이 캔버스를 생성해놨는데, 미처 그래픽 레이 캐스터를 지우지 못하고 방치했더니 프로파일러가 엄청난 스파이크를 발생시키고 있었다.
그래픽 레이 캐스터(Graphic Raycaster)
그래픽 레이 캐스터는 캔버스에 레이저(Ray)를 발사하여 UI에 마우스가 올려졌는지, 클릭하였는지 등을 검사하는 컴포넌트이다.
그래픽 레이 캐스터 - Unity 매뉴얼 (unity3d.com)
버튼이나 슬라이더 같이, 클릭이나 오브젝트 간의 충돌을 이용하기 위해서는 필수적이지만 아닌 경우도 있다.
유니티에서 버튼이나 슬라이더 같은 UI 요소를 생성하면 캔버스가 생성된다.
그런데 캔버스는 기본적으로 그래픽 레이 캐스터 컴포넌트가 부착된 상태로 만들어진다.
만약 캔버스에 체력 바나 단순한 이미지만 붙여놓았다면 그래픽 레이 캐스터는 쓸모가 없게 된다.
아무런 기능이 없기만 하다면 다행이지만, 그래픽 레이 캐스터 자체가 성능 저하를 일으킬 수 있다고 한다.
캔버스 두어 개 정도에 그래픽 레이 캐스터를 붙였다면 크게 상관없겠지만, 만약 오브젝트의 수가 수백, 수천 개가 되면 이벤트 시스템이 어마어마한 렉을 유발할 수 있다고 한다.
해결 방법
이를 막는 방법은 필요 없는 그래픽 레이 캐스터를 제거하는 것이다.
그래픽 레이 캐스터는 클릭이나 마우스를 이용하는 등 상호작용이 필요한 경우가 아니라면 없애도 상관 없다.
가능하다면 필요 없는 그래픽 레이 캐스터는 컴포넌트를 지워서 그래픽 레이 캐스터를 최대한 적게 유지하는 편이 좋다고 한다.
이외에도 최적화에 도움이 되는 팁들이 참고 자료에 있으니 읽어보면 좋을 것 같다.
참고 자료
Event system performance pretty bad - Unity Forum
Some of the best optimization tips for Unity UI - Unity (unity3d.com)
댓글