게임을 하면 배터리가 뜨거워져요~, 개발자적 관점에서
같이 면접에 들어간 동료가 지원자에게 이런 질문을 한 적이 있다.
“내가 만든 게임을 플레이 해보니 휴대폰 배터리가 너무 뜨거워졌어요. 어떻게 해야하나요?”
그 질문을 받은 대부분의 지원자가 “이걸 왜 물어?” 라는 듯한 모습으로, 갑작스런 황당 질문에 자신있는 대답들을 해내지 못한 것은 당연한 일일 것이다.
같이 면접관으로 들어간 나 조차도,
소프트웨어를 개발하는 프로그래머들을 뽑는 자리에서
왜 하드웨어 칩 개발이나 임베디드 개발자에게나 적합한 질문을 하는가?
라고 생각했었다.
그런데 시간이 가며 모바일 게임들을 서비스를 해보면서
“이 게임만 하면 폰이 너무 뜨거워져요”
라는 유저 컴플레인이 고객지원 파트로 꽤나 많이 들어온다는 것을 알았다.
일차적인 원인이 무엇이건 간에 문제는 내가 만든 게임을 플레이 할 때 유저가 폰이 뜨거워져서, 그것이 게임을 플레이하는데 심리적인 혹은 물리적인 부담을 실제적으로 주고 있다는 것이다. 이는 자연히 유저의 이탈률을 높일 수 밖에 없고, 게임의 롱런에 굉장한 영향을 줄 수 있다. (특별히 따뜻한 나라라면 더 그럴 듯~ㅎ )
따라서 이 문제를 단순히 하드웨어적으로 해결할 문제이다 라고 치부하며 무시해 버리는 Stance는 적절하지 않을 수 있다.
로딩 시간을 0.1초 앞당기기 위해서 애쓰고,
Memory Fragmentation을 피하고 메모리 가용성을 위해서 Object Pooling을 하며,
GC의 호출을 최소화하도록 눈에 불이 들어가며 설계는 하고,
Int Array 한개를 안쓰게 refactorying 했다는 사실에 뿌듯해하는 그런 프로그래머라면,
그런 그가, 이런 발열 문제는 신경쓰지 않는다는 것은 조금 Unbalanced 하지 않은가?
하드웨어를 긁어 오거나 I/O를 처리할 때 많은 열이 발생하는 경우는 극히 드물다. 노트북을 돌려보아도, 디스크를 긁을 때가 아니라 CPU가 과부하가 들어오는 즉시 팬이 돌아가는 것을 알 수 있다.
즉, 게임 플레이시 발열은 기본적으로 GPU와 CPU의 부하에서 시작한다.
GPU와 CPU의 부하는 그것들을 따뜻하게하고, 자연히 주변 칩셋들의 부하를 올려 역시 열을 낸다.
또한 그것은 더 많은 전기를 필요로하게 만들어 결국 배터리에서 더빨리 더 많은 전기를 사용하게 만든다.
최종적으로 배터리에서는 부하에 비례하는 많은 열을 발생시킨다.
즉 게임 플레이시의 열은 CPU 및 GPU 등의 칩셋의 열과 배터리에서 발생하는 열이 대부분이다.
결국 게임에서 발열을 줄이기 위해서는 CPU/GPU 사용을 최소화 해야 한다.
이것은 전반적인 게임의 최적화와 관련되어 있어서 쉽지 않은 이슈임은 분명하다.
먼저, 게임 로직을 연산량이 가장 적도록 효율적으로 만드는 것부터 시작해야 한다.
게임의 설계 시 캐릭터와 배경의 폴리곤과 캐릭터 Bone의 갯수를 최소화 하는 것도 필요하다.
Static, Dynamic Batching을 최대한 이용하여 Draw Call을 줄이고, 텍스쳐 Mipmap 옵션, LOD , Occlusion Culling 등도 엔진에서 지원하면 켜야 한다.
Shader의 연산량을 가능한 줄여야 할 것이고, FixedUpdate 사용을 최소화하고 FixedUpdate Gap을 더 크게 조절하는 것도 도움이 된다.
쓸데없이 돌아가는 Update와 Coroutine도 제거해 줘야한다. 그림자 연산 최적화 해야하고, CPU cache miss 발생 또한 가능하면 줄일 수 있도록 신경쓰면 좋다.
이런 일들 중 어느 하나가 폰의 뜨거워지는 문제를 눈에 띄게 해결하는 일은 드물다.
모든 것들이 모여서 전체적으로 게임이 CPU/GPU의 사용량이 낮게 유지되도록 하고 결과적으로 폰의 발열이 크지 않도록 해주기 때문이다.
따라서, 한참 서비스 중인 게임에서 이런 컴플레인이 들어오면, 개발자들이 조금 난감해 하는 이유이다.
그러나, 유저는 그저 “니네 게임을 하니, 내 폰이 뜨거워진다” 라는 문제를 해결받고 싶어 한다.
그리고 개발자들은 하드웨어 제조사를 탓하기 이전에 이것을 해결할 수 있는 무기들이 어느 정도 내가 가지고 있음을 인지하면 좋을 것이다.