전문가 : 안녕하세요. 오지현입니다. 모바일 게임을 위한 리소스를 제작할 때는 폴리곤, 텍스쳐, 쓰로틀링에 신경 써서 리소스 자체를 가볍게 만들어야 한다는 것은 잘 알고 계실 텐데요. 리소스 자체를 가볍게 만드는 것뿐만 아니라 최적화를 위한 여러 기법들을 적용해주는 것 또한 매우 중요합니다. 그래서 이번 시간에는 모바일 게임개발 시 최적화를 위한 다양한 기법에 대한 내용을 다뤄보려고 합니다.
개발자 : 안녕하세요. 제가 이번에 모바일 게임을 개발하면서 최적화를 고려해 리소스 자체의 무게를 줄였는데요. 그것만으로는 최적화가 충분히 이루어지지 않는 것 같아요. 최적화를 위해 어떤 작업들을 더 진행해야 할까요?
전문가 : 리소스의 폴리곤이나 텍스쳐 등 리소스 자체의 무게를 줄이는 것도 중요하지만, 드로우콜을 줄이는 것 역시 매우 중요한데요. 여기서 드로우콜이라는 것은 CPU가 GPU에게 무언가를 그리라는 명령을 보내는 신호를 의미합니다. CPU와 GPU가 서로 다른 프로세서 유닛이다보니, 이러한 명령의 신호는 많은 비용을 소모합니다. 따라서 드로우콜을 줄이는 것이 중요하죠. 드로우콜에는 여러 조건들이 있지만 주로 메시 단위로 이루어집니다. 반드시 그런 것은 아니지만 만일 캐릭터 하나가 한 개의 메시로 만들어져 있으면 드로우콜이 한번 발생하고 두 개의 메시로 만들어져 있으면 드로우콜이 두번 발생하게 되는 것이죠.
이러한 드로우콜 역시 기기마다 성능 차이가 있습니다. 때문에 PC나 콘솔에서는 한 프레임 그리는데 필요한 드로우콜이 1000(천)개 정도 발생해도 큰 무리가 없죠. 하지만 모바일 기기에서는 드로우콜을 100(백)개 이하로 유지시켜주는 것이 중요합니다. 따라서 캐릭터가 많이 나오는 RPG 게임이라면 캐릭터 하나당 하나의 메시로 사용해서, 칼이나 방패 등을 포함해서 많아 봐야 세 네 개 정도의 드로우콜이 발생하도록 해주는 것이 좋습니다. 또, 드로우콜을 줄이는 가장 쉬운 방법 중 하나는 컬링입니다. 보이지 않는 것을 그리지 않는 것이죠. 게임의 스테이지 등 씬 안에는 많은 오브젝트가 존재하는데요.
카메라를 통해서 화면에 보여지는 것은 일부분에 불과합니다. 이렇게 카메라 영역 안에 있는 오브젝트들만 렌더링 해주는 기능을 프러스텀 컬링이라고 부릅니다. 또한 카메라의 프러스텀 컬링 영역에 있지만 눈에 보이지 않는 오브젝트들도 존재합니다. 실내에서 벽 뒤에 가려진 캐릭터나 사물들처럼 말이죠. 이렇게 벽에 가려진 오브젝트들을 컬링해주는 것을 오클루전 컬링이라고 합니다. 이런 컬링 기법들을 이용하면 드로우콜을 절약할 수 있는 것이죠.
사물이 우리 눈에 보이려면 빛이 있어야 하기 때문에 라이팅 처리 역시 매우 중요합니다. 라이팅 처리를 어떻게 하느냐에 따라 렌더링 퀄리티와 성능의 차이가 크게 나죠. 보시는 것처럼 실시간으로 처리되는 조명이 많으면 자연스럽게 보이겠지만 조명이 늘어난 만큼 성능이 떨어지게 됩니다. 라이팅은 셰이더를 통해서 이루어지는데요. 셰이더는 메시와 텍스쳐를 가지고 조명처리를 어떻게 해줄 것인가를 결정하고 최종 화면에 보여지는 색을 결정합니다.
이러한 셰이더는 엔진에서 다양하게 제공해주기도 하고, 셰이더를 직접 만들어서 자신만의 방법으로 표현을 할 수도 있습니다. 성능은 다소 떨어지지만 최대한 실사 같은 느낌을 내는 물리기반셰이더, 디퓨즈 라이팅만 처리해서 성능을 많이 확보하는 셰이더, 만화느낌을 내는 카툰셰이더 등 성능에 따른 다양한 셰이더가 존재하죠.
따라서, 적절한 셰이더를 선택하거나 만들어서 적용해야 합니다. 또한, 게임 그래픽에서 캐릭터의 라이팅 만큼이나 중요한 것이 그림자입니다. 그렇기 때문에 대부분의 게임 엔진이 그림자 기능을 제공하는데요. 그림자를 표현하기 위해서는 많은 연산이 필요합니다. 그래서 성능이 높은 PC에서는 보시는 것처럼 고품질의 그림자를 사용할 수 있는데요. 모바일에서 그림자를 사용하려면 보시는 것처럼 품질을 많이 낮춰주어야 합니다. 사실 품질이 많이 낮아져도 스마트폰 같이 작은 화면에서는 크게 거슬리지는 않습니다.
그래서 그림자를 흉내내기만 해서 성능의 큰 소모 없이 그림자를 표현하기도 하는데요, 예를 들어 보시는 것과 같이 캐릭터의 발 밑에 평면의 동그라미를 그리는 것이죠. 정확한 그림자는 아니지만 그림자인 듯 한 효과를 내는 것입니다. 아니면, 라이트맵을 활용해서 라이팅 성능을 절약할 수도 있습니다. 라이팅과 그림자를 제대로 표현하려면 많은 연산이 필요하기 때문에 성능 소모가 심한데, 이러한 표현 연산이 굳이 실시간으로 이루어질 필요가 없는 경우도 존재합니다.
예를 들어 건물이나 지형 등 배경 오브젝트들은 움직이지 않고 고정된 위치로만 존재하는데요. 이런 정적인 배경 오브젝트들의 라이팅과 그림자는 실시간으로 연산할 필요가 없죠. 그래서 이런 정적인 오브젝트들의 라이팅은 비실시간으로 텍스쳐로 미리 만들어놓기도 합니다. 이 텍스쳐를 그대로 입혀주면서 렌더링에서 가장 무거운 요소인 실시간 라이팅과 그림자 연산을 피하게 되는 것이죠. 이러한 정적인 오브젝트들의 라이팅을 미리 만들어 놓은 텍스쳐를 라이트맵이라고 합니다.
개발자 : 앞서 설명해주신 내용들은 대부분 그래픽에 관련된 최적화 기법에 대한 내용이었는데요. 이는 아무래도 게임이 실시간 렌더링으로 이루어지기 때문이겠죠? 그렇다면 렌더링 부분만 최적화하면 충분한 것인가요?
전문가 ; 물론 아닙니다. 한 프레임이 렌더링되는 과정을 생각해보세요. 물리 AI 등의 게임 로직 처리가 이루어지고 나서야 렌더링이 처리되죠? 때문에 로직 등 프로그래밍으로 처리하는 부분들도 최적화를 해주어야 합니다. 먼저 게임에는 다양한 게임 엔진들이 있고 각 게임 엔진들마다 기본적으로 연동하는 언어가 다르기 때문에 엔진에서 사용하는 언어의 특성을 이해해야 합니다.
대표적으로 사용되는 언어에는 C#, C++, 루아가 있는데요. C#에서는 가비지 컬렉터라는 시스템이 메모리를 알아서 관리해주기 때문에 프로그래머는 메모리 해제를 신경쓰지 않아도 됩니다. 따라서 프로그래머는 편리하게 작업할 수 있지만, 가비지 컬렉터 자체가 시스템에 부하를 주기도 하죠. 반면 C++은 프로그래머가 메모리의 할당과 해제를 직접 해줘야 합니다. 때문에 프로그래머가 메모리를 직접 관리할 수 있는 자유도가 주어지지만, 그만큼 메모리에 대한 책임을 져야 합니다. 마지막으로 루아는 C#이나 C++보다 다루기 쉽고 진입 장벽이 낮지만, 복잡하고 무거운 시스템을 만들기에는 다소 빈약한 면이 있죠.
더불어 최적화된 프로그래밍을 하기 위해서는 로직 등의 알고리즘을 잘 짜야 합니다. 성능 좋은 로직을 만들기 위해서는 어느 부분이 성능을 잡아먹는지를 알아야 하는데요. 이를 위해 게임 엔진들에서는 프로파일러 기능을 제공합니다. 화면에서 보는 것처럼 프로파일러를 통한 프로파일링을 통해서 코드의 어느 부분이 성능 소모를 하는지를 알 수 있습니다.
지금까지 모바일 게임의 최적화를 위한 다양한 기법으로 드로우콜, 라이팅, 프로그래밍 언어 등에 대해 다루어 보았는데요. 이번 시간에 설명드린 내용을 통해 모바일 게임 최적화 기법의 대략적인 개념을 이해하고, 모바일 게임개발의 방향을 잡는데 도움이 되셨으면 좋겠습니다. 수고하셨습니다.
01. 이 강좌에 대해서
모바일 게임을 위한 리소스를 제작할 때는 폴리곤, 텍스쳐, 쓰로틀링에 신경 써서 리소스 자체를 가볍게 만들어야 합니다. 또한 리소스 자체를 가볍게 만드는 것뿐만 아니라 최적화를 위한 여러 기법들을 적용해주는 것 또한 매우 중요합니다. 따라서 모바일 게임개발 시 최적화를 위한 다양한 기법에 대한 내용을 알아보고자 합니다.
02. 강사 소개
오지현 (유니티 코리아 엔지니어)
03. 강사 이력
- 유니티 테크놀로지스 코리아 필드엔지니어 - 경력 : ㈜나코인터렉티브_게임 클라이언트 프로그래머, ㈜아스텔_ DVR 장비 S/W 개발, ㈜마이에트엔터테인먼트_게임 엔진 개발, 유니티 테크놀로지스 코리아_필드엔지니어