이펙트의 드로우콜
유니티에서 중요한 최적화 요소 중 하나는 Draw Call / Set Pass Call / Over Draw 등이 이다.
메쉬의 경우 정적 배칭과 아틀라스를 활용하여 Draw Call을 줄이는 건 잘 알려져 있는 사실이다.
하지만 이펙트의 경우도 반드시 최적화가 필요한 부분이다.
유니티 이펙트는 Particle System 컴포넌트로, 하나의 이펙트를 만들기 위해서는 여러 Particle System들을
조합해서 만드는 것이 일반적이다. 때문에 각각의 Particle System은 별도로 Texture와 Material을 갖게 된다.
이 과정에서 파티클 시스템 당 1개의 Draw Call과 Set pass Call이 발생해버린다.
배경은 그 고생을 해서 Draw Call을 1~2개로 줄여놓고 파티클 하나가 10개넘는 Draw Call을 차지하게 된다.
약간은 편법이지만, 유니티의 파티클도 텍스쳐 아틀라스를 통해 최적화가 가능하다.
http://ogrehead.com/2016/10/using-texture-atlas-for-particle-system-in-unity/
텍스쳐가 POT가 되야 하기 때문에, 텍스쳐의 사이즈는 256x256 이나 512x512를 쓰는 것이 보통일 것이다.
구성은 2x2, 3x3, 4x4 등이 가능하고, 한 사분면만 쪼개는 구성도 가능하다.
링크의 튜토리얼대로 따라해보면 '모든 텍스쳐가 빌보드일때는' 드로우콜 1개짜리가 만들어진다.
하지만 메쉬를 사용하는 이펙트가 있다면 꼬이기 시작한다.
위 사진은 테스트에 사용한 이펙트이다. 세 개의 Particle의 Material은 모두 동일하다.
중앙 메쉬 / 원형 빌보드 / 작은 점 빌보드
로 이루어져있어서, 메쉬를 고려하더라도 드로우콜이 2라고 예상했었다.
헌데, 드로우콜이 무려 10이나 되는상황.
배칭이 이루어지지않는다면 배경을 그리기위한 1과 각 이펙트의 3개씩을 계산하면 원래는 16이 나와야하며,
다이나믹 배칭이 제대로 이루어졌다면 2여야하고, 메쉬들은 배칭이 되지않았다면 7이 나왔어야한다.
그런데 10이라는 어중간한 숫자는 일부만 배칭되었다는 결론이 난다.
이 사실을 확인해보기 위해 메쉬이펙트를 끄고 테스트 해본 결과 메쉬이펙트가 없다면,
제대로 배칭이 이루어지는 것을 확인했다. (메쉬만 따로 해보면 6이 나온다. 즉, 같이 있으면 배칭이 일부만 됨)
메쉬에 들어가는 머테리얼을 다른것으로 교체해보았다. 오히려 배칭이 더 심각하게 이루어지지 않는다.
왜 이럴까?
배칭은 '같은 머테리얼을 사용하는 오브젝트를 한번에 그리는 것'이다.
그런데 알파 값이 들어간 오브젝트는 뒤쪽부터 순서대로 그리기 때문에
위치 관계에 따라 그리는 순서가 뒤섞일 수 있다.
예를들어 A -> A -> B -> B 로 그린다면, 배칭이 2로 정상적이지만
A -> B -> A -> B 순으로 그린다면, 별도의 배칭으로 4가 되는 것.
때문에 그리는 순서를 강제하기 위해 파티클의 RenderQueue를 3000 에서 3001로 변경해 봄.
(ParticleSystem의 Renderer - Order in layer 를 변경해도 된다)
7이 되었다. 결국 메쉬들은 배칭이 이루어지지않지만 적어도 모든 빌보드들은
제대로 배칭이 이루어진 것을 확인하였다.
Trail들은 딱히 영향을 받지않고 알아서 다이나믹 배칭이 잘 이루어 지는 듯 하다.
- 메쉬는 하나의 파티클 시스템에서 여러개 그리면 드로우콜 한개지만, 똑같은 걸 다른 파티클 시스템에서 그리면 배칭이 되지않음.
- 메쉬 파티클들은 따로 material 쓰고 렌더큐도 별도로 지정해 주자.
- 메쉬(쿼드)를 사용하는 이펙트는 가능한 빌보드로 변경 하자
'🌍 Unity > 최적화' 카테고리의 다른 글
Unity Postprocessing stack v2 / Camera effect / image Effect (0) | 2018.12.29 |
---|---|
유니티 스프라이트 UI 최적화 관련 메모 / Unity Sprite UI Optimize (0) | 2017.10.03 |
LOD를 적용해보자 ! Simplygon! (2) | 2017.01.01 |
큐브맵은 6드로우콜을 잡아먹는다. (0) | 2016.12.08 |
LayerCullDistance (0) | 2016.11.14 |