[Unity] ParticleSystem의 성능 최적화 (Prewarm/Culling Mode)
보통 아트 부서에서 ParticleSystem을 이용하여 이펙트를 만들지만, 최적화는 프로그래머가 담당하게 된다. 이때 파티클의 emission 개수나 duration에 대한 조언을 하게 되는데, 이것들 외에 체크해 볼 것이 prewarm과 culling mode이다.
Prewarm 기능은 파티클의 emission을 한번 한 상태로 만들어 주어 다음 파티클 플레이시 원하는 모양으로 분사되도록 한다. 하지만, 씬을 로딩할 때 부하를 주기도 하는데, prewarm된 파티클의 개수에 따라 부하의 정도는 달라지겠지만, 초기화시 모든 파티클이 로드되기 때문에 씬 로드에 소요되는 시간이 늘어나게 된다. 특히 동적으로 씬을 추가한다면 이로 인해 화면이 끊기거나 freezing될 수도 있다.
프로파일러를 통해 prewarm에 대한 부하를 쉽게 찾을 수 있다.
위와 같이 ParticleSyste.Prewarm이 프로파일러에 노출된다면, 로드되는 씬에 prewarm이 enable된 파티클이 얼마나 있는지 확인할 필요가 있다.
Prewarm이 필요하고, 씬 로드를 빠르게 하고 싶다면, 이펙트를 Pool에 넣어 사용하고, 씬 로드와 분리하여 별도로 로딩하는 프로세스를 만들어야 한다. Pool의 구현 방식은 구글링해보면 다양하게 나와 있으니 참고하면 되겠다.
두번째로, Culling Mode에 대해 확인해보자. Culling Mode는 파티클이 화면에 보이지 않을 때 어떻게 처리할 지에 대한 세팅이다.
메뉴얼에서와 같이 Always Simulate가 되어 있다면 화면 노출 여부와 상관없이 항상 플레이 되고 있기 때문에 성능을 갉아먹는 요인이 될 수 있다. 이펙트가 looping으로 되어 있다면, Pause로 설정하는 것이 성능에 효과적이다. Pause and Catch-up은 화면에서 벗어나면 중단되지만, 다시 화면에 노출될 때 그 사이에 일어났을 과정에 대한 연산으로 인해 성능에 영향을 주게 된다. 그러므로 게임별 상황에 맞추어 Culling Mode를 세팅할 필요가 있겠다.