안녕하세요!
이번에는 안드로이드에서 게임을 최적화 했던 과정을 정보 공유도 겸해서 씁니다.
----------------------
얼마전에 오랜만에 핸드폰에서 게임을 돌려보다가 렉이 생각보다 심각하다는 사실을 발견했습니다.
분명 옛날에는 쌩쌩하게 돌아갔었기 때문에, 왜 느려진 건지 원인을 알아내기로 했습니다.
1. 유니티 프로파일러로 찾아보기

기본 내장 프로파일러입니다.
development build를 키고 apk를 빌드하고, adb나 로컬 네트워크로 앱에 연결해서 볼 수 있습니다.
실제 게임중에 렉이 빡!하고 걸리는 부분이 있는데, JIT가 대부분 원인이였습니다.
그런데 이건 해결하기가 까다로웠습니다. 코드를 한번 돌려줘야하는데, 감이 안잡혔습니다.
그래서 그냥 IL2CPP를 쓰기로 했습니다. (자세한 내용은 https://blogs.unity3d.com/kr/2015/09/22/kr-csharp-compile-il2cpp/ 참고)
그런데 스파크를 잡긴 했지만, 전체적으로 프레임이 떨어지는 건 여전히 해결되지 않았습니다.
느린 부분을 찾아봤지만 딱히 문제가 될만한 부분은 없어 보였습니다.
다만 유니티 이벤트 시스템이 생각보다 많이 먹었는데 이건 캔버스에 쓸데없이 raycastTarget옵션을 많이 켰던 게 원인이였습니다.
2. 프레임 디버거

이것도 유니티 내장 툴인데, 저희는 주로 배칭이 제대로 되는지를 확인할 때 사용하고 있습니다.
렉이 심하게 걸리는 장면에서 그림자 배칭이 안되고 있다는 걸 확인해서 고쳤습니다.
고치고 다니 조금 빨라진 것 같은 느낌이 들었는데, 역시 옛날의 그 쌩쌩한 느낌은 아니였습니다.
그리고 다른 장면을 테스트해보니 여전히 느렸습니다.
3. Mali Graphics Analyzer
렌더링하는 게 느린 건 대충 알았는데, 정확히 어떤 요소를 그리느라 느린 건지 알 수 없었습니다.
이 때 유용한 게 그래픽카드 회사에서 배포하는 분석 툴들입니다.
하지만 이게 좀 복불복이 좀 있습니다.
핸드폰마다 툴이랑 호환이 잘 되는 것도 있고, 잘 되는 것도 있습니다.
저는 갤럭시S6를 써서 Mali Graphics Analyzer로 테스트해봤는데, 다른 건 다 되는데 정작 중요한 Fragment Count 정보를 못얻어왔습니다.
옛날에는 분명 잘 됐는데, 뭔가 버전이 꼬이면서 잘 안되게 된 것 같습니다.
오랜 시간 삽질을 해봤지만, 도저히 문제를 해결할 수 없었습니다.
결국 다른 방법을 찾기로 했습니다.
4. 각종 툴들



모바일에서 느린 건 PC에서도 느릴 거라고 생각해서(비율적으로) PC에서도 여러가지 검사를 해봤습니다.
하지만 툴이 동작은 잘 하는데, 도움될만한 정보는 안나왔습니다.
그래서 이 방법은 일단 보류하기로 했습니다.
5. systrace

유니티 2019.1부터 systrace를 지원한다고 해서 안드로이드 스튜디오로 프로파일링을 해봤습니다.
하지만 너무 개괄적인 내용만 나와서 어떤 요소가 느린 건지 알 수가 없었습니다.
이건 제가 세팅을 제대로 안해서 결과가 이상하게 나온 것 같은데, (원래 좀 더 자세하게 나와야함)
무엇을 잘못했는지 알 수가 없어서 일단 보류하기로 했습니다.
7. simpleperf
구글링 도중에 simpleperf가 좋다는 글을 보게 되었습니다. (https://www.slideshare.net/JaeseungHa/ndc2018-96510072)
그래서 따라해봤는데, 처음에는 제대로 되지 않았습니다.
원인은 삼성폰에서 adb run-as 명령을 지원하지 않는다는 것이였습니다.
그래서 결국 어쩔 수 없이 루팅을 해서 문제를 해결했습니다.
그리고 몇시간에 걸친 삽질 끝에 결국 데이터를 뽑는데 성공했습니다

이제까지랑 다르게 결과가 자세하게 나오니 상당히 유용했습니다.
쓸데없이 돌고 있던 코루틴도 발견해서 제거했고, 여러 느린 부분을 고쳤습니다.

보시다시피 물리 contact callback에 오버헤드가 크다는 사실도 발견했습니다.
실제 이벤트를 받고 코드가 실행되는 부분은 저렇게 작은데, 그걸 하기 위한 준비 작업은 저렇게나 큽니다.
그래서 관련된 부분을 고치고, 이 외에도 자잘자잘하게 느린 부분들을 고쳤습니다.
그 과정에서 JobSystem도 적용해봤는데 데드락 문제 때문에 다시 롤백하기도 했습니다.
8. 멀티스레드 렌더링
그런데 이렇게까지 코드를 쥐잡듯이 잡았는데도, 여전히 뭔가 시원한 느낌이 생기지 않았습니다.
그러다가 우연히 프로젝트 세팅에서 멀티스레드 렌더링이 꺼져있다는 사실을 발견했습니다.
예전에 멀티스레드 렌더링이 하도 불안정해서 꺼놨었는데, 시험삼어 켜서 빌드를 해봤습니다.
결과는 놀라웠습니다.
딱 예전의 그 쌩쌩한 느낌이 바로 재현됐습니다.
몇일간의 삽질이 무색하게도 빨라졌습니다.
플레임그래프로 확인해보니 확실히 멀티스레드 렌더링이 도움이 되는 걸 확인할 수 있었습니다.

(멀티스레드 렌더링 off)

(멀티스레드 렌더링 on)
렌더링 쓰레드가 먹는 시간과 메인 쓰레드가 먹는 시간이 비슷합니다. 그렇기 때문에 CPU 자원을 효율적으로 쓰게되는 셈입니다.
결론은 멀티스레드 렌더링을 키자.
읽어주셔서 감사합니다!
------------------- 이전 글 ---------------------
1편 소개
2편 괴물
3편 약탈자
4편 파편시스템
5편 대쉬퍼즐
6편 브금소개
7편 스프라이트 순서 처리
9편 대화 시스템
10편 그래픽 리소스 제작과정
11편 레벨 프로토타입 영상
12편 지형 시스템
13편 버려진 레벨들
14편 무기 시스템
15편 룬 시스템
16편 폭탄 퍼즐 레벨
17편 몬스터 제작 과정
--------------------------
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.