포트나이트

포트나이트 Android 출시 기술 분석

2018. 9. 6.
글쓴이 포트나이트팀

소개

8월 9일, 포트나이트 Android 베타가 파트너사인 삼성의 특정 디바이스에서 출시되었습니다. 며칠 뒤, 다양한 스마트폰 제조업체의 제품을 사용하는 Android 디바이스 소유자도 일부를 선정하여 포트나이트 Android 베타에 참여할 수 있는 초대장을 보내기 시작했습니다. 포트나이트 베타 버전을 통해 퍼포먼스, 보안, 디바이스 호환성은 물론 포트나이트 설치 관리자를 이용한 포트나이트 Android 버전의 배포 등 많 교훈을 얻을 수 있었습니다. 다음은 출시와 관련한 기술적인 세부 사항, 현재 진행 중인 작업, 조만간 제공될 Android 관련 기능을 자세히 서술했습니다.

통계

포트나이트 Android 버전이 출시된 후 21일 동안, 엄청난 관심이 쏟아졌고, 2천3백만 명 이상의 사용자가 Android 베타를 이용했고, 천5백만 명 이상의 사용자가 포트나이트 APK를 설치했습니다.  포트나이트 Android 버전은 아직 초대받은 사용자만 플레이할 수 있는데, 초대받은 사용자가 실제로 플레이하는 전환율은 iOS 베타 버전 때와 동일합니다.

하드웨어, 최적화


기술 소개

모든 플랫폼에 같은 게임을 출시하면서 동시에 크로스 크로스 플레이를 지원하는 일은 유래없는 어려운 일이었습니다. 일반적으로, 모바일 디바이스에 맞춰 게임 사양을 낮출 때는 플랫폼의 퍼포먼스 제약에 따라 콘텐츠, 심지어 디자인까지도 간소화하게 됩니다. 예를 들어, 카메라에 가까운 오브젝트를 컬링하여 드로 콜 수를 줄일 수도 있습니다. 하지만 포트나이트에서는, Android 플레이어가 PC와 콘솔에서 접속한 친구들과 같은 방에서 플레이할 수도 있기 때문에, 게임 플레이에 영향을 주는 모든 요소를 렌더링해야 합니다.

Android 버전 출시 과정

2018년 1월부터 포트나이트 배틀로얄 Android 버전의 핵심 팀과 함께 열심히 작업을 진행해 왔습니다. 대부분 렌더링 퍼포먼스, 안정성, 메모리 관련 작업이었지만, 여러가지 다양한 Android 하드웨어, OS 버전, 드라이버 버전을 지원하는 일 또한 상당한 난관이었습니다.

파트너사와의 협력은 포트나이트 Android 버전을 만드는 데 아주 중요했습니다. 그들의 지식, 전문성과 노력이 없었다면 불가능했을 것입니다.

삼성과의 긴밀한 협력을 통해 삼성 디바이스에서 포트나이트를 프로파일링하고 최적화했습니다. 삼성은 전 세계의 여러 에픽게임즈 본사와 지사에 엔지니어를 파견하여 에픽게임즈의 엔지니어와 함께 최적화와 퍼포먼스 분석 작업을 진행했고, 특히 Vulkan 렌더러를 위해 수많은 코드를 변경했습니다. 삼성 엔지니어가 계측기(instrument)를 장착한 테스트 폰과 자체 개발한 툴을 사용하여 알려준 정보를 토대로 퍼포먼스 및 메모리 병목 현상 발생 위치와 해결 방법을 파악할 수 있었습니다. 또한 삼성 휴대폰 사용자를 위한 가장 원활하고 안전한 설치 프로세스를 만드는 작업도 함께 진행했습니다.

Google의 엔지니어도 포트나이트를 프로파일링하고 최적화 하기 위해서 에픽게임즈를 방문하여 중요 최적화와 메모리 누수를 찾는데 도움을 주었고, 또한 Android의 OpenGL에서 안정적인 프레임 속도를 구현할 수 있었습니다. Google의 Android 엔지니어는 게임에 탁월한 Android 생태계를 조성하고 지속적으로 개선하려는 능력과 열정이 대단했습니다.

또한 ARM, Qualcomm, Imagination Technologies, Razer, HiSilicon을 비롯한 수많은 다른 파트너사와 함께 포트나이트 테스트 및 최적화 작업을 했습니다.

파편화

Android 생태계는 여러 제조사가 만든 폰으로 구성됩니다. 각 폰은 보통 CPU와 GPU 코어를 한데 묶은 단일 칩 시스템(SoC)으로 설계되어 있습니다. SoC 제품군은 다양한데, 그 중에서도 (현재 지원 디바이스의 71% 를 차지하는) Qualcomm의 Snapdragon에는 Adreno GPU 가 탑재되고, 삼성의 Exynos / MediaTek의 MT 시리즈 / HiSilicon의 Kirin 시리즈 모두 ARM Mali GPU가 탑재되어 있습니다. 각 디바이스는 조금씩 다른 Android 운영체제 버전으로 출시되며, 대부분의 제조사는 스케줄러와 전력 관리 기능을 알맞게 설정합니다. 디바이스의 GPU가 같더라도 출시할 때 그래픽 드라이버 버전이 다를 수 있습니다. 그 결과 같은 기본 하드웨어를 공유하는 두 디바이스가 퍼포먼스 특성이 매우 달라질 수 있고 또 서로 다른 버그가 발생하기도 합니다.

최신에서 2년 된 디바이스까지의 최신 안드로이드 버전 사용 비율이 우리가 기대했던 것 보다 훨씬 높다는 것이 기쁘고 놀라웠습니다. 디바이스 요구 사양이 높은 현재 베타에서 포트나이트 사용자의 운영체제는 Android 8 (Oreo) 이상이 92%, Android 7 (Nougat) 이 8% 미만, 2015년 이전에 출시된 Android 버전이 0.5% 미만입니다. 2년 이상 된 디바이스에서는 상당한 퍼포먼스 저하가 발생합니다. 이러한 디바이스의 경우 제조사가 직접 알맞은 업데이트를 출시해야 하며, 대부분의 경우 전 세계 수많은 무선 이동통신사와 조율해 이러한 업데이트를 개발하고 출시해야 합니다.

이런 복잡함을 관리하고자, 언리얼 엔진의 계층형 디바이스 프로파일 시스템을 사용합니다. 먼저 낮음, 중간, 높음, 에픽이라는 4단계 퍼포먼스 프로파일을 만듭니다. 이 프로파일은 퍼포먼스 특징이 서로 다른 디바이스에서 게임을 실행할 수 있도록 엔진 퀄리티 설정을 조정해 줍니다. 낮음 프로파일은 가시거리를 최소로 줄이고 모든 선택적인 그래픽 옵션은 비활성화합니다. 에픽 프로파일은 그림자, 폴리지, 최대 가시거리 등 최신 디바이스가 소화할 수 있는 모든 그래픽 옵션을 활성화합니다.

그 외에도 Adreno 54x, Mali G72 등 별도의 GPU 프로파일 세트가 있습니다. 이 GPU 프로파일은 하드웨어 능력에 가장 잘 맞는 퍼포먼스 프로파일 선택은 물론 딱 그 하드웨어에 필요한 최적화나 우회법을 적용할 수도 있습니다. 마지막으로 삼성 Galaxy Note 9 Adreno 또는 Google Pixel 2 XL 같은 디바이스 전용 프로파일 세트도 있습니다. 이 디바이스 프로파일 마지막 레이어를 통해 특정 디바이스에서 추가적인 우회법이나 최적화를 적용할 수 있습니다. 시작 시 디바이스 모델, OS 버전, 그래픽 드라이버 버전 같은 속성을 확인해 적용할 디바이스 프로파일을 결정합니다.

렌더링 퍼포먼스

안정적인 프레임 속도를 유지하는 데 있어 가장 큰 퍼포먼스 병목 현상은 단연코 렌더링의 CPU 비용이었습니다. PC, 콘솔, iOS에 비해 Android 의 그래픽 드라이버에서 훨씬 더 많은 CPU 시간을 소모합니다. Galaxy S9 Adreno 버전 같은 대부분의 최신 Android 디바이스는 프레임당 1500 드로 콜을 처리하지만, 구형 디바이스는 처리량이 훨씬 낮습니다. 지원하려는 중급 디바이스는 평균 600 드로 콜, 하급 디바이스는 평균 400 정도를 처리해야 합니다.

올해 초 iOS 에 출시할 때 이미 각 프레임 렌더링에 필요한 오브젝트 수를 필요한 수준으로 줄여놨기 때문에, 다른 방법을 찾아야 했습니다. 드로 콜을 인스턴스된 드로 콜로 동적으로 배칭하는 기능을 시험해 보니 약간의 개선은 있었지만 더 복잡해진 코드를 감당할 만큼 충분하진 못했습니다.

우리 OpenGL 렌더러에 적용된 수많은 최적화도 약간의 성과가 있었지만, 가장 큰 성과는 전혀 뜻밖에도 메모리 최적화 중의 하나인 에뮬레이티드 유니폼 버퍼였습니다. 이것은 UE4가 수년 동안 지원해 온 코드 패스이며 유니폼 버퍼, 즉 상수 버퍼를 기본 지원하지 않는 OpenGL ES2 디바이스에 사용합니다. 작동 방식은 다음과 같습니다. 셰이더 컴파일 시간에 셰이더에 필요한 상수를 모두 확인하고 셰이더가 읽는 배열에 패킹합니다. 유니폼 버퍼에서 상수를 모아둘 곳과 상수 배열 어디에 넣을지를 엔진에 알려주는 매핑 테이블도 저장합니다. 실행시간에, 유니폼 버퍼를 CPU 액세스 가능 메모리에 유지하고, 매핑 테이블을 사용하여 임시 버퍼로 복사한 뒤, glUniform4fv 함수 호출 한 번에 모든 상수를 업로드합니다.

정확한 원인은 알 수 없지만, 에뮬레이티드 유니폼 버퍼 코드 패스는 드라이버에 드는 시간을 대폭 절약해 주었습니다. 아마도 드라이버가 내부적으로 비슷한 작업을 하기에 우리 구현의 작업 처리가 빨라졌을 수 있습니다. 또는 생성하고 바인딩하는 리소스 수가 적어져 단순히 드라이버가 그 버퍼 수명 관리를 위한 예약 시간을 덜쓰는 것일 수도 있습니다. 어쨌든 이 패스로 드라이버 비용이 10-15% 절감되는 경우가 있었습니다.

Vulkan

Vulkan은 Android의 최신 그래픽 API로, 퍼포먼스 및 하드웨어 로우 레벨 액세스를 위해 설계되었습니다. 2016년 삼성과 협력해 Android에서 고사양 그래픽 API로 가능한 수준을 선보이는 ProtoStar 데모를 제작했습니다. 포트나이트는 프레임마다 정말 많은 오브젝트를 그려야 하므로, 자연스럽게 Vulkan이 적당해 보였습니다. 안타깝게도 현실은 그렇게 명확하게 맞아 떨어지지 않았습니다.

Vulkan 지원은 아직 Android의 필수사항이 아니므로 아직 생태계 전반에 사용할 수 있다고 예상할 수 없습니다. 문제가 심하지 않은 최신형 하드웨어만을 목표로 삼고 있는데도 초기 Vulkan 드라이버에 여러가지 버그와 퍼포먼스 문제가 생겼으니, 대부분의 디바이스에서 Vulkan 보다 OpenGL 이 빠르고 안정적이라는 결론이 납니다. 놀랄 일도 아닙니다. 업계 전체가 10여 년 동안 OpenGL 구현을 최적화하고 발전시켜 왔으니까요. Vulkan은 더 복잡한 API라 같은 수준의 성숙도에 도달하려면 시간이 걸릴 것입니다.

삼성 S9+ (Adreno)와 Note 9 (Adreno)에 출시할 때 Vulkan을 지원했습니다. 삼성 엔지니어와의 긴밀한 협력 덕분에 우리는 UE4의 Vulkan 지원을 최적화해 OpenGL 대비 평균 20%의 속도 상승을 달성했습니다. 나아가 하드웨어 파트너사와도 계속 협력해 다른 디바이스에도 하이 퍼포먼스 Vulkan 을 지원함으로써 포트나이트 Android 플레이어에게는 더 나은 경험을, 모든 개발자에게는 Vulkan 드라이버 퍼포먼스 향상을 선사할 것입니다.

메모리

메모리와의 사투는 현재 진행형입니다. 모바일 디바이스에 콘솔 게임을 그대로 출시한 것도 모자라 새 콘텐츠도 계속 추가하고 있습니다. 그래서 메모리 최적화 방법을 계속 찾아야 합니다. 게다가 Android는 다른 플랫폼에 없는 어려움이 있었습니다.

메모리 예산 목표치를 딱 하나로 잡을 수가 없었습니다. 디바이스마다 메모리 양이 다르고, 백그라운드로 실행 중인 앱 종류도 다르며, 메모리를 너무 많이 사용하는 앱을 종료시킬 시기를 결정하는 정책도 잠재적으로 다릅니다. 이 메모리 예산을 구하는 API는 없습니다. 기준점 확보를 위해 메모리 테스트 도중 매치에 들어가 메모리 할당을 시작하고 OS 가 프로세스를 종료시킬 때까지 놔뒀습니다. 방금 재시작하고 어떤 앱도 실행하지 않은 삼성 Galaxy S8(Mali)에서, 종료까지 총 메모리 4GB 중 3GB를 할당할 수 있었습니다. Google Pixel 2에서는 총 메모리 3.6GB 중 1.8GB만 할당할 수 있었습니다.

시스템, 특히 그래픽 드라이버는 사용자 대신 메모리를 많이 할당합니다. UE4는 GPU 메모리 할당 측정을 포함해 OS에서 직접 요청하는 모든 메모리를 추적하지만, 드라이버가 무엇을 할당하는지는 정확히 보여주지 못합니다. 실험을 통해 드라이버가 포트나이트에 할당하는 메모리 대부분이 셰이더로 간다는 사실을 알아냈습니다.

앞서 언급한 에뮬레이티드 유니폼 버퍼 최적화는 메모리 때문에 작업해온 요소였습니다. OpenGL은 앱이 유니폼 버퍼의 모든 멤버 위치를 쿼리할 수 있어야 합니다. 예를 들어 OpenGL에 프리미티브 유니폼 버퍼 내 LocalToWorld 매트릭스에 대한 오프셋을 물어볼 수 있습니다. 이를 지원하려면 드라이버는 메모리에 오프셋 테이블과 같은 어떤 메타 데이터에 각 멤버의 이름 문자열을 포함해서 유지해야 하며, 모든 프로그램에 똑같이 해야 합니다.

포트나이트에는 다양한 셰이더가 존재합니다. 일반적인 플레이 세션에서 엔진은 약 2,000개의 셰이더 프로그램을 사용합니다. 각 셰이더 프로그램 내부에서 드라이버가 이 메타데이터를 보관해서 메모리가 많이 추가되는 것 같습니다. 에뮬레이티드 유니폼 버퍼를 이용해 포트나이트에서 400MB 이상의 메모리를 절약했습니다!

포트나이트 Android를 처음 출시할 때, 내부 테스트 결과 목표 디바이스의 메모리 제약을 충족하는 것으로 나타났습니다. 우리는 Google 지도의 길찾기와 음악 스트리밍을 켠 상태로 테스트를 진행했고, 아무 문제 없이 포트나이트를 플레이할 수 있었습니다. 하지만 출시 후 많은 플레이어가 메모리 부족으로 인한 크래시 또는 퍼포먼스 저하를 겪는다는 것을 발견했습니다.

메모리가 부족하면 Android 폰은 사용하지 않는 어플리케이션을 종료해 리소스를 확보합니다. 하지만 OS 가 종료해도 그냥 재시작되는 이상한 백그라운드 앱과 서비스가 많다는 사실이 밝혀졌습니다. 이러면 사실 상황이 더 악화됩니다! Android는 메모리를 되찾자고 앱을 종료했는데 바로 재시작되면서 차지하는 메모리 양이 전과 같아집니다. 설상가상으로 앱을 시작하고 종료하는 작업에도 CPU 시간이 들기에 메모리를 확보하지도 못하고 불필요한 CPU 리소스만 많이 들어간 것입니다.

대부분의 사용자가 실행하는 인기 앱을 더 많이 설치하고 실행하도록 테스트 프로세스를 변경해서 이러한 문제를 일찍 발견할 수 있었지만 여전히 메모리 사용량을 빠르게 줄여야 했습니다. 메모리가 4GB 인 최신 Qualcomm Snapdragon 디바이스에서 높음 또는 에픽 설정인 사용자로 문제를 좁힐 수 있었습니다. 여기서도 셰이더 메모리가 주요한 차이점으로 보였습니다. 임시 방편으로 그림자를 비활성화하니 문제 완화에 도움이 되었습니다. 이렇게 하면 더이상 섀도맵 다른 버전을 룩업 및 필터링하지 않아도 되므로 셰이더 수가 줄어듭니다. 셰이더용 LRU 캐시도 추가했습니다. 이 캐시 덕에 현재 씬 렌더링에 필요한 셰이더 프로그램만 메모리에 유지할 수 있습니다. 다른 셰이더 프로그램은 메모리에 압축해서 저장합니다. 필요하면 압축을 풀어 드라이버로 보냅니다.

미래 - 향후 계획

지금은 지원하는 모든 디바이스에서 게임을 원활하게 실행하고 충분한 메모리를 긁어 모아 비주얼 퀄리티와 안정성을 모두 개선하는 데 집중하고 있습니다. 그런 다음에는 사운드 등의 호환성 문제를 처리할 계획입니다. 5.40 릴리즈에서 많은 디바이스의 사운드 문제를 해결하여 더 많은 디바이스를 지원할 수 있게 되었습니다. 또한 보다 상세한 디바이스 튜닝 컨트롤을 제공하여 사용자가 직접 퀄리티와 퍼포먼스 사이에서 선택할 수 있도록 할 계획입니다.

지속적으로 Vulkan 지원을 개선하고 점차 더 많은 디바이스를 지원할 것입니다. 디바이스 제조사와 협력해 UE4 는 물론 그 드라이버도 최적화를 계속하겠다는 뜻입니다. 장기적으로 Vulkan 지원 및 드라이버 개선을 위한 투자는 Android에 출시된 모든 UE4 게임은 물론 플레이어에게도 더 나은 퍼포먼스로 돌아올 것입니다.

아직도 느린 구형 휴대폰을 알아보고 있지만, 너무 멀리 가는 것은 비현실적입니다. 매년 최고 수준의 휴대폰은 전년 대비 50% 빨라지고 있습니다. 포트나이트는 2년 전 휴대폰에서도 적당하게, 1년 전 휴대폰에서는 우수하게, 올해 출시된 휴대폰에서는 탁월하게 실행됩니다. 이 추세라면, 내년에 출시된 휴대폰에서는 포트나이트가 어떤 모습일지 기대되지 않나요!

image2.png


마지막으로, 엔진에 적용한 수많은 코드 최적화는 이미 UE4 4.20에 같이 출시되었습니다. 남은 최적화는 향후 4.21 릴리즈에 출시될 예정이며, 이후의 최적화는 모든 UE4 개발자와 지속적으로 공유할 계획입니다.

맬웨어와의 전쟁

포트나이트 Android 버전을 출시한다는 발표도 하지 않았는데, 가짜 ‘포트나이트 Android' 웹사이트가 생기는 것을 알게 되었습니다. 이러한 사이트는 대부분 맬웨어거나 사기입니다. 이러한 사이트를 알게된 후, 사이트 자체, 관련 호스트 제공업체, 해당 사이트를 홍보하는 모든 광고와 비디오를 차단하는 방법을 알아봤습니다. 맬웨어 배포 여부에 상관없이, 다른 웹사이트에서 포트나이트 Android를 배포하거나 유사 배포하는 모든 행위는 무단 행위로 간주합니다. 포트나이트 Android의 유일한 합법적 출처는 공식 포트나이트 설치 관리자를 통해 에픽게임즈에서 직접 다운로드하는 것입니다.

현재까지 에픽게임즈는 가짜 ‘포트나이트 Android’ 웹사이트 47개에 대한 조치에 착수했고, 그중 상당수는 같은 범인이 운영하는 것으로 추정됩니다. 경찰과 협력해 이러한 사이트를 폐쇄하거나, 다음과 같은 브라우저 내 경고를 구현할 수 있는 (ISP, 브라우저 업체, 안티 바이러스 업체 포함) 사기 방지 파트너사와의 관계를 적극 활용해서 액세스를 차단하는 노력을 계속하고 있습니다.

Image1.png

전담 내부 팀을 동원해 새로운 맬웨어 사이트를 사전에 검색합니다. 또한 외부 IP와 사기 방지 집행 기관을 고용해 대응력을 확장하고 있습니다. 이러한 협력 관계 덕분에 의심스러운 URL로 등록된 새로운 도메인을 감지 및 감시하다 악성 사이트로 돌변하면 소송을 포함한 적절한 조치를 취할 수 있습니다.

결론

포트나이트 Android는 여러가지 부분에서 업계 최초입니다. 콘솔 및 PC 게임을 안드로이드에 출시하면서 호환성과 크로스 플레이를 완벽 지원하는 최초의 게임이자, Google Play 스토어를 통하지 않고 출시되는 최초의 블록버스터 게임입니다. 엄청난 책임과 학습의 과정이었지만, 천오백만 이상 되는 Android 사용자의 빠른 선택을 받은 것은 이 방식이 타당하고 매우 성공적일 수 있다는 것을 보여줍니다. 그리고 가장 중요한 것은, 포트나이트 Android에 적용한 모든 기술은 언리얼 엔진 4.21 을 통해 모든 언리얼 엔진 개발자에게 공개되어 모두가 혜택을 누릴 수 있다는 것입니다.