2021년 7월 16일 금요일

Bloom Shader 최적화

 Bloom Shader 최적화

유니티의 다양한 기본 포스트 프로세싱 중에 Bloom이라는 기능이 있다.

광원에 좀 더 효과를 주는 기능인데 잘 조절 하면 이쁘게 나오지만 성능에 제법 부하를 주는 친구다. 특히 게임이 모바일이라면 더욱 더

우선 Bloom 효과를 적용하고 프레임 디버그를 이용해 확인 해보면 다음 과 같은 결과를 볼 수 있다.
-프레임 디버그로 확인한 Bloom-

여러장의 텍스처를 이용해 찍어내는데 메모리도 있지만 draw call도 상당히 증가하고 덕분에 프로파일러를 통해 확인해보면 

-프로파일러로 확인한 Bloom-


괜찮은 성능의 pc에뮬로 기본 씬에서 찍어도 0.5~1.0ms를 차지한다.
실제 개발중인 모바일게임 프로파일링 당시에는 많게는 8ms를 차지 하기도 했다.(8ms면 30프레임 기준으로 혼자서 1/4을 차지 하는 수준이다.)

그러면 이러한 문제를 어떻게 해결할 수 있을까
답은 간단하다 Bloom이 찍는 텍스처 수를 줄이면 된다.

-PostProcessPass-

Package - Universal RP - Runtime -  Passes - PostProcessPass.cs
해당 스크립트의 50번째 줄 정도를 보면 k_MaxPyramidSize라는 변수가 있다.

해당 변수가 Bloom효과를 적용할 때 횟수를 정해준다 과감하게 2로 줄인다.


-2로 줄인 후의 결과-

Draw call은 22 -> 4로 감소 하였고, 0.5ms -> 0.1ms로 감소 하였다.
실제 모바일게임에서는 8ms에서 1ms까지 감소하는 효과를 보여주었다.

물론 해당 방법을 사용하게 되면 적용되는 Bloom효과가 다소 다르게 보여지기 때문에 수치 조절은 다시 해줘야한다.

해당 기능 성능이 다소 부담되기도 하고 줄여도 어느 정도 수치 조절로 커버가 가능한 모바일 게임에서 유용하게 사용 할 수 있을 것으로 보인다.

해당 수정사항들은 패키지 파일의 스크립트를 수정 하는 것이니 패키지 파일을 Package 폴더로 따로 이동해 custom하게 사용을 해야한다.(그렇지 않으면 유니티를 재부팅하면 원상복구된다.)

댓글 없음:

댓글 쓰기