Omówienie narzędzia Android Performance Tuner (natywna)

W tym artykule opisujemy, jak zintegrować narzędzie Android Performance Tuner, znane też jako biblioteka Tuning Fork, aby rejestrować i przesyłać dane o czasie klatki z natywnych silników gier (C i C++).

W przypadku silnika Unity zapoznaj się z przewodnikiem po Unity.

Tło

Kluczowym elementem rozgrywki jest wydajność renderowania. Na wydajność renderowania wpływają 2 czynniki:

  • Liczba klatek: jak często rysowana jest klatka.
  • Ustawienia jakości grafiki: poziom wierności, z jakim jest prezentowana klatka, w tym wierność symulacji i grafiki.

W przypadku gier dobra wydajność renderowania jest definiowana w ten sposób:

  • zapewnia stabilną i stałą liczbę klatek (czyli odsetek klatek renderowanych z żądaną częstotliwością);
  • Renderowanie klatek z najwyższą możliwą częstotliwością przy zachowaniu stabilności, zwykle 30 lub 60 klatek na sekundę w zależności od typu gry.
  • Maksymalizowanie poziomu szczegółowości dla użytkownika przy danej wielkości i gęstości ekranu przy jednoczesnym osiąganiu pożądanej, stabilnej liczby klatek.

Biblioteka Android Frame Pacing ogranicza większość wahań czasu renderowania klatki, zapewniając stabilną liczbę klatek w grach. Pozostałe różnice w czasie wyświetlania klatek wynikają z poziomu szczegółowości wyświetlanej w niektórych scenach rozgrywki oraz możliwości graficznych urządzenia. Dzięki narzędziu Android Performance Tuner możesz określić momenty w grze, w których czas renderowania klatek jest krótszy lub dłuższy niż docelowy, i powiązać te problemy i możliwości z:

  • Określone ustawienia jakości
  • konkretne sceny w grze;
  • określone modele urządzeń lub ich specyfikacje,

Zapisywanie i przesyłanie danych

Biblioteka Tuning Fork korzysta z jednej z jej funkcji tick, która jest wywoływana w każdej klatce przez bibliotekę Android Frame Pacing. W bibliotece te informacje są agregowane w histogramy, które są okresowo przesyłane do Google Play za pomocą punktu końcowego HTTP. Każde kliknięcie jest rejestrowane jako powiązane z kluczem instrumentu i adnotacją, których definicje określasz w pliku bufora protokołu.

Klawisze instrumentu

Klucz instrumentu wskazuje, z którego miejsca w ramce pochodzi znacznik, i jest liczbą całkowitą, którą należy przekazywać do każdego wywołania funkcji znacznika. Biblioteka Android Frame Pacing używa wstępnie zdefiniowanego zestawu kluczy instrumentów, które są zdefiniowane w swappy_common.h. Możesz też zdefiniować własne klucze instrumentów, jeśli nie używasz biblioteki Frame Pacing.

Adnotacje

Adnotacje zawierają kontekstowe informacje o tym, co gra robi, gdy rejestrowany jest znacznik. Adnotacja może na przykład identyfikować dowolny z tych elementów:

  • bieżący poziom gry,
  • Na ekranie jest „duży boss”
  • inne istotne informacje o stanie gry.

Adnotacje są definiowane przez komunikat buforowany protokołu com.google.tuningfork.Annotation. Aby ustawić bieżącą adnotację, przekaż serializację zdefiniowanego komunikatu do funkcji TuningFork_setCurrentAnnotation(). Wszystkie kolejne dane o tickach są powiązane z tą adnotacją, dopóki nie zostanie ustawiona kolejna adnotacja. Oto przykładowa definicja proto adnotacji:

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

Parametry wierności

Parametry wierności wpływają na wydajność i jakość grafiki gry, na przykład na poziom szczegółowości siatki, rozdzielczość tekstur i metodę antyaliasingu. Podobnie jak adnotacje, parametry wierności są definiowane za pomocą komunikatu bufora protokołu com.google.tuningfork.FidelityParams. Poniżej znajdziesz przykładową definicję protokołu parametrów wierności:

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;
}

Podczas inicjowania Tuning Fork przekazujesz serializację parametrów używanych przez grę. Możesz zmienić te parametry, jeśli na przykład użytkownik zmieni ustawienia renderowania gry, a przesłane przez Ciebie dane będą powiązane z nowymi parametrami.

Aby Google Play mógł odczytać zdefiniowane przez Ciebie adnotacje i parametry wierności, plik bufora protokołu zawierający te definicje musi być dołączony do pliku APK gry wraz z ustawieniami inicjowania. Musisz też podać domyślne wartości typowych kombinacji parametrów wierności w pliku APK, aby dane były segmentowane według nich w interfejsie Google Play. Więcej informacji znajdziesz w artykule Określanie poziomów jakości.

Obciążenie pamięci i procesora

Cała pamięć używana przez bibliotekę Tuning Fork jest przydzielana podczas inicjowania, aby uniknąć niespodzianek w trakcie rozgrywki. Rozmiar danych zależy od liczby kluczy instrumentów, liczby możliwych adnotacji i liczby przedziałów w każdym histogramie. Jest on wielokrotnością tych wartości pomnożoną przez 4 bajty na przedział. Wszystkie histogramy są też dostępne w 2 kopiach, co umożliwia przesyłanie ich w trybie podwójnego buforowania.

Przesyłanie odbywa się w osobnym wątku i nie blokuje wywołań funkcji tick. Jeśli połączenie do przesyłania nie jest dostępne, zgłoszenie zostanie dodane do kolejki do późniejszego przesłania.

Wywołanie funkcji tick wiąże się z niewielkim obciążeniem przetwarzania: po prostu oblicza indeks w tablicy przedziałów histogramu i zwiększa liczbę całkowitą.

Integracja biblioteki Tuning Fork

Ten przewodnik po integracji jest podzielony na 2 części. W pierwszej części opisujemy, jak przeprowadzić test kompleksowy za pomocą aplikacji demonstracyjnej i Konsoli Google Play. W drugiej części opisujemy, jak zintegrować bibliotekę Tuning Fork z łańcuchem narzędzi i jak korzystać z funkcji, które udostępnia ta biblioteka. Aby rozpocząć, kliknij link Dalej poniżej.