오늘은 ManiMind게임의 모바일빌드의 최적화에 대해서 다뤄보려고 한다.
현업에서 일하고 계신 분의 피드백을 받아서 생각지도 못한 최적화방법을 여럿 알게되었다.
우선, 우리 조에서 자체적으로 실행한 최적화 방법들을 먼저 소개하겠다.
GPT에서 뽑은 이미지들이 많다보니 스프라이트 크기가 모두 제각각이였다. 스프라이트 이미지와 텍스처파일의 경우 가로세로 크기를 모두 2제곱수로 바꿔주는 것이 좋다. GPU에서는 가로세로 크기가 2제곱수가 아닌경우 가까운 2제곱수로 패딩하는 과정을 거치면서 성능적인 오버헤드가 발생한다. 또한 쓸데없이 픽셀값이 큰 이미지파일의 경우 크기자체를 줄여서 GPU로드의 부하를 줄였다.
초기에 에셋을 받았을 때 텍스처파일의 포맷이 PSD로 되어있었다. 이는 포토샵에서 사용하는 포멧인데 쓸데없는 정보를 많이담고있기때문에 텍스쳐파일의 사이즈가 너무나 컸다. 이를 PNG로 변경하여 최적화를 진행하였다.
배경에 해당하는 오브젝트들을 Static으로 지정 후 라이트맵을 미리 구워서 사용하려했다. 그림자를 만드는 연산이 성능을 많이 잡아먹기 때문이다. 하지만 우리가 받은 에셋의 경우 셰이더에서 라이트맵 베이크를 지원하지않아 해당기능을 사용할 수 없었다.
런타임 그림자 설정을 Soft Shadow에서 Hard Shadow로 변경하였다. Soft Shadow의 경우 부드러운 그림자를 연산하는 과정에서 정점(vertex)에 대한 계산이 많아서 성능을 많이 잡아먹는다.
텍스처 아틀라스를 통해 하나의 스프라이트를 잘라서 사용하면 드로우콜을 크게 줄일 수 있다. 드로우콜은 성능을 많이 잡아먹는 동작이므로 성능최적화에 도움이된다.
DPI는 Dots Per Inch의 줄임말로 디스플레이 화면의 해상도를 나타내는 지표이다. Resolution메뉴에 들어가서 Resolution scalingmode를 Fixed DPI로 바꾼 뒤, DPI를 300~600정도로 바꿔본다. 이렇게 해서 화질 차이가 없으면, 그냥 DPI 값을 낮춰 사용하면 성능적으로 도움이 된다. 블룸 같은 기능을 안쓴다면 안티에일리어을 꺼도 상관없다. 이를 줄이면 성능을 끌어올릴 수 있다.
유니티6에서는 그래픽 렌더링 관련 성능이 많이 개선되어 유니티6를 사용하는 편이 좋다. 구글플레이 정책에서도 API 34이하버젼을 11월까지만 지원하기때문에 어차피 유니티6를 사용해야한다. 현업에서도 유니티는 모바일 이외에는 PC게임에서 거의 사용하지않는다.
Struct를 사용할 수 있는 상황에서 Class를 사용했다. GC관련 성능문제가 발생할 수 있는 여지를 만드는 것이기 때문에 Struct를 사용할 수 있다면 Struct를 사용해라.
foreach와 LINQ의 경우 일반적인 for문과 비교해서 연산차이가 난다. 박싱, 언박싱에서의 연산차이와 비슷한경우이다.