본문 바로가기

[unity] 유니티에서 발열 줄이는 방법(게임 최적화 방안)

앤디가이 2022. 10. 26.

유니티로 개발한 게임 및 앱에서 발열 증상 개선에 도움이 될만한 몇 가지 게임 최적화 포인트에 대해 알아보자.

 

최근 삼성에서 발생한 GOS(Game Optimizing Service) 이슈에 대해 들어봤을 것이다.

게임 진행시 과도한 발열을 방지하기 위해 화면 밝기, 텍스쳐 품질, CPU, GPU 등의 성능을 조절하는 서비스였다.

하지만 고객이 인지하지 못한 상태에서 구동되었기 때문에 최신폰을 구매한 사람들에게 있어서 많은 비난을 받게 되었다.

 

여기서 한 가지 생각해봐야 할 이슈가 바로 발열이다.

핸드폰은 작은 컴퓨터와 같기 때문에 전산 처리량이 많은수록 당연히 발열이 발생한다.

 

발열이라는 것이 하드웨어 칩 개발이나 임베디드 단에서 해결해야 할 수도 있다. 하지만 하드웨어 한계가 확실히 존재하는 이상, GOS 같은 눈속임을 위한 서비스 등이 나올 수밖에 없다. 

 

그렇다면, 내가 만든 게임에서 발열을 안 나게 할 수는 없을까?

물론 게임의 종류에 따라 다르겠지만, 일반적인 게임처럼 처리 요소가 많이 들어가는 개발에는 발열은 줄이는 것은 가능하나, 발열을 안 나게 하드웨어 조작을 하는 것은 불가능하다.

 

유니티 개발자로서 프로젝트를 하면서 겪어왔던 발열과 대처 방안에 대해 이야기해보고자 한다.

(어떻게 보면 GOS 서비스에 상당한 힌트가 숨겨져 있다)

 

 

발열의 원인은?

유니티로 개발한 앱(게임)에서 발생하는 발열은 기본적으로 GPU와 CPU의 부하로부터 시작된다.

이런 부하는 많은 전기를 필요로 하고 배터리를 더 활성화하여 전기를 발생시킨다.

이에 따라 배터리에서 많은 열이 발생된다.

 

가끔 배터리가 너무 뜨거워져서 이거 터지는 거 아니야?라고 생각했던 경우도 있다.

많은 처리량 -> CPU 부하 -> GPU 부하 -> 배터리 과열 등의 과정으로 발열이 발생한다.

 

이런 발열을 줄이기 위해서는 CPU 및 GPU의 처리량을 최소화시키고 게임을 최적화하는 다양한 노력들이 필요하다.

 

 

발열 줄이는 로직 및 환경 만들기

우선 내가 만든 게임의 코드를 하나하나 돌아볼 필요가 있다.

최적화 개념을 가지고 효율적으로 게임 로직을 연산량이 적게 개선해야 한다.

 

1. Update 함수 사용 최소화 하기

내 코드에서 돌아가는 Update문의 로직이 문제가 없는지 확인한다.

Update문은 매 프레임 실행되기 때문에 60 frame인 경우, 1초에 60번 연산이 들어가는데 그 안에 코드가 복잡하고 계산이 많을수록 부하가 늘어난다. 

대체 방안으로는 코루틴이나 UniTask 등으로 대체하면 좋다.

UniTask 활용방안은 아래 포스팅을 참고하면 좋다.

2022.05.26 - [unity3d/Modules] - [unity] 모듈 제작 : UniTask 활용한 Network system 제작

 

2. Draw Call 줄이기

유니티 에디터에서 Draw Call과 Bacth는 실시간으로 볼 수 있다.

Draw Call을 줄이고 공유 매터리얼과 공유 텍스쳐 등을 활용하여야 한다.

기본적으로 Batch값이 보이는 화면에서 300이 넘지 않도록 구성하는 것이 모바일 최적화에 핵심이다.

 

3. UGUI 최적화

UI 구성에 있어 핵심 시스템인 UGUI의 구성을 최적화해야 한다.

많은 요소들을 GUI로 구성하면, 업데이트될 때마다 캔버스를 랜더링 하게 된다.

캔버스가 복잡할수록 그만큼 연산량도 많아진다.

기본적으로 이미지에 체크되어 있는 충돌 옵션도 필요 없으면 해제해 주는 것이 좋다.

UI의 기본 해상도는 720(HD)기반으로 초기 구성을 잡는 것이 좋다.

폰 해상도 기반으로 설정하게 되면, 많은 픽셀을 사용하기 때문에 퍼포먼스가 떨어지면서 발열이 일어난다.

 

UGUI 최적화는 기존에 작성한 포스팅이 있으니 참고하면 좋다.

2022.06.14 - [unity3d/Research] - [Unity] UI를 위한 UGUI 최적화 방안

 

4. 오브젝트 풀링 생활화

Instantiate 함수로 오브젝트를 계속 생성, 삭제(Destroy) 하는 것은 상당히 많은 비용과 발열을 유발한다.

오브젝트 풀링 기법을 활용하여, 생성, 삭제가 빈번하게 이뤄지는 객체는 오브젝트 풀에 담아 놓고 필요시 재사용하는 방안으로 로직을 구성해야 한다.

 

5. 퀄리티 세팅 옵션 확인

유니티에서 메뉴->프로젝트 세팅의 Quality 세팅 항목을 확인하자.

모바일에서는 Pixel Light Count가 1보다 크면 성능이 많이 떨어진다.

Anti Aliasing 옵션도 Disabled 로 되어 있어야 한다.

텍스쳐 옵션 등도 조절이 가능한데 이건 어느 정도 퀄리티를 고려하여 조절하면 좋다.

그림자도 Soft 보다는 Hard를 사용하고, 필요한 곳에만 그림자 효과를 넣는 것이 좋다.

유니티 Quality 세팅
유니티 Quality 세팅

6. 물리 프레임 수 조절

물리 연산의 경우 CPU 사용이 가장 많은 영역이다.

게임의 연산 고정 프레임을 60으로 하는 경우가 많은데, 스피드 있는 게임이 아니라면, 40~50으로 조정해도 느껴지는 큰 차이가 없다.

이렇게 고정 프레임을 조정하여, 물리연산을 최소화할 수 있다.

 

7. LOD 기능 활용 및 Dynamic Batching 활용

움직임이 고정된 배경 오브젝트인 경우 Static 옵션을 체크하여, 변경에 의한 연산을 최소화시킨다.

카메라의 LOD 기능을 활성화하여, 랜더링 해야 하는 폴리곤 수를 실시간으로 커스터마이징하여 연산량을 줄일 수 있다.

 

8. Shader 최적화

유니티에서 기본적으로 제공하는 셰이더 이외에 커스텀한 셰이더를 사용하고 있다면, 해당 셰이더가 연산량이 많은지 검토해 볼 필요가 있다. 셰이더 자체가 무겁고 연산이 많으면 그만큼 랜더링 해야 될 때 연산량이 많아진다.

모바일일 경우 모바일 전용 셰이더를 사용하는 것이 좋다.

 

9. Adaptive Performance 고려

유니티에서 ECS(Entity Component System), C# 잡 시스템 및 버스트 컴파일러를 기반으로 DOTS(데이터 지향 기술 스택)로의 개발 발전 방향을 잡고 있다. 이런 시스템 등을 고려하여 설계 및 개발하면 발열을 줄일 수 있다고 유니티에서 가이드해주고 있다.

이 부분은 유니티의 공식 블로그를 통해 확인할 수 있다.

유니티 Adaptive Performance 보러가기

 

유니티의 어댑티브 퍼포먼스, 높은 수준의 품질과 원활한 프레임 속도 보장 | Unity Blog

메가시티는 수백만 개의 엔티티를 갖춘 인터랙티브한 미래 도시로, Unity가 현세대 모바일 하드웨어에서 가장 복잡한 프로젝트도 실행할 수 있음을 잘 보여줍니다. 또한 이를 통해 ECS(Entity Componen

blog.unity.com

 

프로파일러 활용하기

유니티 프로파일러가 갈수록 기능이 좋아지고 있다.

유니티에서 Window/Analysis의 Profiler를 클릭하여, 프로파일러를 열어준 후 게임을 실행하여, 프로파일러의 각 항목을 체크하면서 최적화할 수 있는 부분을 탐색한다.

기본적으로 CPU 사용과 Physics 사용량, Rendering 영역 등에 대한 프로파일이 가능하기 때문에 갑자기 튀는 구간에 있어서 최적화할 수 있는 포인트를 찾아내는 것이 중요하다.

유니티 프로파일러
유니티 프로파일러

 

발열 잡는 일은 정말 꼼꼼하게 프로젝트를 분석해야 최적화 요소를 잘 도출하고 수정해야 한다.

100% 발열이 안 나게 개발할 수는 없지만, 과도한 배터리 과열은 개발자가 좀 더 신경 써서 개발한다면 많이 개선할 수 있는 영역이다.

 

 

댓글