Android Performance Tuner 개요(네이티브)

이 주제에서는 Tuning Fork 라이브러리라고도 하는 Android Performance Tuner를 통합하여 네이티브(C 및 C++) 게임 엔진에서 프레임 시간 데이터를 기록하고 업로드하는 방법을 설명합니다.

Unity 게임 엔진의 경우 Unity 가이드를 참고하세요.

배경

게임 환경의 핵심 구성요소는 렌더링 성능입니다. 렌더링 성능은 다음 두 가지 입력의 결과입니다.

  • 프레임 속도: 프레임이 그려진 빈도입니다.
  • 그래픽 품질 설정: 그래픽뿐만 아니라 시뮬레이션 충실도를 포함하여 프레임이 표시되는 충실도 수준입니다.

게임의 경우 우수한 렌더링 성능은 다음과 같이 정의됩니다.

  • 안정적이고 일관된 프레임 속도(즉, 원하는 주파수로 렌더링되는 프레임의 비율) 구현
  • 게임 유형에 따라 일반적으로 30 또는 60FPS의 안정성을 유지하면서 가능한 가장 높은 주파수로 프레임 렌더링
  • 원하는 안정적인 프레임 속도를 달성하면서 화면 크기 및 밀도를 고려하여 사용자의 세부정보 수준 극대화

Android Frame Pacing 라이브러리는 프레임 시간의 많은 변동을 제한하여 게임에 안정적인 프레임 속도를 제공합니다. 프레임 시간의 나머지 변동은 게임플레이의 특정 장면에서 표시되는 세부정보 수준과 기기의 그래픽 기능으로 인해 발생합니다. Android Performance Tuner를 사용하면 게임플레이 도중 프레임 시간이 목표보다 느리거나 빠른 시점을 정확히 찾아내고 이러한 문제 및 기회를 다음과 상호 연관시킬 수 있습니다.

  • 특정 품질 설정
  • 게임의 특정 장면
  • 특정 기기 모델 또는 기기 사양

데이터 기록 및 업로드

Tuning Fork 라이브러리는 Android Frame Pacing 라이브러리에 의해 각 프레임에 호출되는 틱 함수 중 하나를 사용합니다. 라이브러리 내에서 이 틱 정보는 히스토그램에 집계되며 이후에 HTTP 엔드포인트를 통해 Google Play에 주기적으로 업로드됩니다. 각 틱은 계측 키주석과 연결된 것으로 기록되며, 계측 키와 주석의 정의는 개발자가 프로토콜 버퍼 파일에 지정합니다.

계측 키

계측 키는 프레임에서 틱이 시작되는 위치를 나타내며 각 틱 함수 호출에 전달되어야 하는 정수입니다. Android Frame Pacing 라이브러리는 swappy_common.h에 정의되어 있는 사전 정의된 계측 키 세트를 사용합니다. 또한 Frame Pacing 라이브러리를 사용하지 않는다면 자체 계측 키를 정의할 수도 있습니다.

주석

주석은 틱이 기록될 때 게임이 어떤 작업을 하고 있는지에 관한 컨텍스트 정보를 제공합니다. 예를 들어 주석은 다음을 식별할 수 있습니다.

  • 현재 게임 레벨
  • 특정 장면이 로드 중인지 여부
  • 화면에 '빅 보스'가 있는지 여부
  • 관련 있는 기타 게임 상태 정보

주석은 com.google.tuningfork.Annotation 프로토콜 버퍼 메시지에 의해 정의됩니다. 현재 주석을 설정하려면 정의한 메시지의 직렬화를 TuningFork_setCurrentAnnotation()에 전달합니다. 그러면 이후 모든 틱 데이터는 다른 주석이 설정될 때까지 이 주석과 연결됩니다. 다음은 주석의 proto 정의 예입니다.

import "tuningfork.proto"
enum LoadingState {
  INVALID_LS = 0;
  LOADING = 1;
  NOT_LOADING = 2;
}
enum Level {
  INVALID_LEVEL = 0;
  Level_1 = 1;
  Level_2 = 2;
  Level_3 = 3;
}
message Annotation {
  optional LoadingState loading_state = 1;
  optional Level level = 2;
}

충실도 매개변수

충실도 매개변수는 메시 세부정보 수준, 텍스처 해상도 및 앤티앨리어싱 방법과 같은 게임의 성능 및 그래픽 재현성에 영향을 줍니다. 주석과 마찬가지로 충실도 매개변수는 com.google.tuningfork.FidelityParams 프로토콜 버퍼 메시지를 사용하여 정의됩니다. 다음은 충실도 매개변수의 proto 정의 예입니다.

import "tuningfork.proto"
message FidelityParams {
  int32 texture_quality_level = 1;
  int32 shadow_resolution = 2;
  float terrain_details_percent = 3;
  int32 post_processing_effects_level = 4;
}

Tuning Fork 초기화 시 게임에서 사용하는 매개변수의 직렬화를 전달합니다. 예를 들어 사용자가 게임 렌더링 설정을 변경하고 이후에 업로드된 데이터가 새 매개변수와 연결된 경우 이러한 매개변수를 변경할 수 있습니다.

개발자가 정의한 주석 및 충실도 매개변수를 Google Play에서 이해하기 위해서는 이러한 정의를 포함하는 프로토콜 버퍼 파일을 초기화 설정과 함께 게임의 APK 내에 번들로 제공해야 합니다. 또한 Google Play UI에서 공통 충실도 매개변수 조합으로 데이터를 세분화하려면 APK에 이 조합의 기본값도 제공해야 합니다. 자세한 내용은 품질 수준 정의를 참고하세요.

메모리 및 CPU 오버헤드

게임플레이 도중 당황하는 일이 없도록 하기 위해 Tuning Fork 라이브러리에서 사용하는 모든 메모리는 초기화 시에 할당됩니다. 데이터의 크기는 계측 키 수, 가능한 주석 수 및 각 히스토그램의 버킷 수에 따라 다릅니다. 각 버킷에 대해 이러한 모든 수 x 4바이트의 배수입니다. 또한 이중 버퍼링 방식으로 제출할 수 있도록 모든 히스토그램 사본이 두 개 있습니다.

제출은 별도의 스레드에서 이루어지며 틱 호출을 차단하지 않습니다. 업로드 연결을 사용할 수 없다면 제출은 나중에 업로드되도록 큐에 추가됩니다.

틱 함수를 호출하는 데는 처리 오버헤드가 거의 없습니다. 단순히 히스토그램 버킷 배열로 색인을 계산하고 정수 카운트를 증가시킵니다.

Tuning Fork 라이브러리 통합

이 통합 가이드는 두 부분으로 나뉩니다. 첫 번째 부분에서는 데모 앱 및 Google Play Console을 사용하여 엔드 투 엔드 테스트를 실행하는 방법을 설명합니다. 두 번째 부분에서는 Tuning Fork 라이브러리를 도구 모음에 통합하는 방법 및 라이브러리에서 제공하는 함수를 사용하는 방법을 설명합니다. 시작하려면 아래의 다음 링크를 클릭하세요.