개발 라이브러리 & 툴/유니티

Unity 최적화 작업 후에... #2

하늘흐늘 2022. 1. 23. 14:32
반응형

이 글에서는 Unity 모바일 게임에 대한 프로그래밍적 최적화 경험 중 인상적인 것들에 대해서 이야기할까 합니다. 

프레임 레이트 (FPS)
게임 최적화의 핵심적 결과물은 몇 프레임이 나오는가 하는 것인가 입니다. 프레임이 잘 나온다는 것은 그 만큼 원활히 게임을 플레이할 수 있다는 말이기도 합니다. 모든 최적화의 결과는 기존 FPS를 최적화 후 얼마나 올렸는가로 표현될 수 있기도 합니다.

FPS 최적화를 하기 위해서 우선 유니티 프로파일러에 나오는 FPS를 참고하는 것이 좋습니다. 전체적인 흐름에서 대략적인 FPS를 알 수 있습니다. 이외 별개로 개별적인 항목만을 본 FPS도 중요합니다. 한 예로 저사양의 기기에서는 Rendering 항목의 FPS 자체가 적게 나옵니다. 이를 바탕으로 어느 정도의 FPS의 한계를 판단할 수 있습니다.

FPS를 올리는 방법 중 매프레임마다 실행되는 Update 함수 내의 스크립트 최적화가 중요한데 이것은 전에 올린 아래 포스트에 나와 있습니다.
참고: Update 최적화: Update 함수

FPS 관련 최적화 작업을 할 때 Unity 프로파일에서 대략적인 FPS를 보는 것이 많이 도움이 되었지만 이외에도 실제적으로 1초에 실행된 FPS가 얼마인지 아는 것도 중요했습니다. 
1초에 실제로 실행된 FPS가 얼마인지 보는 소스는 아래 포스트에 나와 있습니다.
참고: Unity FPS 체크 소스

실제적으로 1초간에 실행된 FPS를 보면서 게임을 테스트하다 보면 FPS가 떨어지는 구간을 화면에서 확인할 수 있습니다. 이 방법을 활용하여 최적화 중에 FPS정보를 바탕으로 특정 파티클 실행시 급격하게 FPS가 떨어진다는 것을 알아냈습니다. 그리고 해당 지점의 파티클을 수정하여 FPS를 올렸습니다.

마지막으로 Unity에서 목표 FPS 설정은 원활한 게임플레이, 발열, 배터리 사용 등을 고려하여 설정하는 것이 좋은데 복잡하지 않은 하이퍼캐주얼을 만든 관계로 원활한 게임 플레이에 중점을 두어 60 FPS을 목표로 최적화 하였습니다.

가비지 컬렉션
Unity는 C#을 스크립트 엔진으로 사용하는 관계로 가비지 컬렉션의 최적화를 필요로 하였습니다. 최악의 경우 가비지 컬렉션은 게임을 잠시 멈추게 할 수도 있습니다. 
제가 만든 게임에서는 우선 증분 가비지 컬렉션을 사용하지 않고 중간 중간에 직접 가비지 컬렉션을 호출하도록 만들었습니다. 이는 증분 가비지 컬렉션이 최악의 가비지 컬렉션은 막지만 모바일에서는 이것도 매프레임 영향을 주는 것 같았기 때문입니다. 대신 만드는 게임 특성상 스테이지가 짧은 관계로 스테이지 클리어시 마다 직접적으로 가비지 컬렉션을 호출하게 최적화 하였습니다.
만든 게임의 객체들은 생성과 삭제가 아니라 생성과 재사용이 되도록 오브젝트 풀을 많이 활용하였습니다. 전반적으로 재사용이 일어나도록 하여 삭제에 따른 가비지 컬렉션이 최소화되도록 최적화 하였습니다. 
참고로 최대한 new로 생성한 뒤 일정부분 사용한 뒤 더 이상 사용되지 않는 객체를 적게 만드는 것이 중요합니다.
참고로 가비지 컬렉션의 최적화는 Unity 프로파일에서 GarbageCollector로 확인할 수 있으며 궁극적으로는 게임 플레이 중에 가비지 컬렉션으로 느려지는 것을 느끼지 않으면 성공적인거 같습니다.

오브젝트 풀
객체의 생성과 삭제에 대한 비용을 최소화로 하기 위하여 오브젝트 풀을 많이 활용하였습니다. 객체의 생성은 씬에서 최대 동시 표현 개수까지 늘어날 수 있게 최적화 하였습니다. 
가비지 컬렉션을 발생시킬 수 있는 짧은 객체들 예로 WaitForSeconds 같은 객체들까지 모두 오브젝트 풀을 활용하여 가비지 컬렉션이 최소한으로 일어나도록 최적화 하였습니다.

 

반응형