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

Z tego artykułu dowiesz się, jak zintegrować funkcję Android Performance Tuner (czyli bibliotekę Tuing Fork), aby nagrywać i przesyłać dane o czasie renderowania klatek z natywnych silników gier (C i C++).

Jeśli szukasz silnika gry Unity, zajrzyj do przewodnika po Unity.

Tło

Kluczowym elementem rozgrywki jest wydajność renderowania. Wydajność renderowania zależy od tych 2 danych wejściowych:

  • Liczba klatek: częstotliwość renderowania klatki.
  • Ustawienia jakości grafiki: poziom wierności wyświetlanej klatki, w tym symulacja i grafika.

W przypadku gier dobra wydajność renderowania jest definiowana jako:

  • Stabilna, stała liczba klatek (czyli odsetek klatek renderowanych z pożądaną częstotliwością).
  • Klatki renderowane z najwyższą możliwą częstotliwością przy zachowaniu stabilności, która zwykle wynosi 30 lub 60 FPS w zależności od typu gry.
  • Maksymalizacja poziomu szczegółów dla użytkownika, biorąc pod uwagę jego rozmiar i gęstość ekranu, a jednocześnie uzyskanie pożądanej, stabilnej liczby klatek.

Biblioteka Android Frame Pacing ogranicza znaczną liczbę zmian w czasie renderowania klatek, zapewniając stabilną liczbę klatek w grach. Pozostałe różnice w czasie renderowania klatki wynikają z poziomu szczegółów wyświetlanych podczas rozgrywki oraz z możliwości graficznych urządzenia. Dzięki narzędziu Android Performance Tuner możesz określić, kiedy podczas rozgrywki czas renderowania klatki jest dłuższy lub krótszy od docelowego. Te problemy i możliwości pomogą Ci:

  • Określone ustawienia jakości
  • Konkretne sceny w grze
  • Konkretne modele lub dane techniczne urządzenia

Nagrywanie i przesyłanie danych

Biblioteka Tuning Fork korzysta z jednej z jej funkcji znacznika, która jest wywoływana dla każdej klatki przez bibliotekę Android Frame Pacing. W bibliotece informacje te są agregowane w histogramach, które są następnie okresowo przesyłane do Google Play przez punkt końcowy HTTP. Każde znacznik jest rejestrowany jako powiązany z kluczem instrumentu i adnotacją, czyli definicjami podanymi w pliku bufora protokołu.

Instrumenty klawiszowe

Klawisz instrumentu wskazuje miejsce w ramce, z którego pochodzi znacznik, i jest liczbą całkowitą, która musi być przekazywana do każdego wywołania funkcji tick. Biblioteka Android Frame Pacing korzysta ze wstępnie zdefiniowanego zestawu klawiszy instrumentów zdefiniowanego w zasadzie swappy_common.h. Jeśli nie używasz biblioteki Frame Pacing, możesz też zdefiniować własne klucze instrumentu.

Adnotacje

Adnotacje zawierają kontekstowe informacje o tym, co robi gra po zarejestrowaniu sygnału. Adnotacja może na przykład identyfikować następujące elementy:

  • obecny poziom gry;
  • Na ekranie pojawia się „duży szef”
  • inne istotne informacje o stanie gry.

Adnotacje są definiowane przez wiadomość bufora protokołu com.google.tuningfork.Annotation. Aby ustawić bieżącą adnotację, należy przekazać zserializowaną wiadomość zdefiniowaną przez siebie do TuningFork_setCurrentAnnotation(). Wszystkie kolejne dane znacznika będą powiązane z daną adnotacją, dopóki nie zostanie ustawiona kolejna adnotacja. Poniżej znajdziesz przykładową definicję proto dotyczącą 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, np. poziom szczegółowości siatki, rozdzielczość tekstur i metodę anti-aliasingu. Podobnie jak w przypadku adnotacji, parametry wierności są definiowane za pomocą komunikatu bufora protokołu com.google.tuningfork.FidelityParams. Oto przykładowa definicja proto 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 np. wtedy, gdy użytkownik zmieni ustawienia renderowania gry, a przesyłane później dane zostaną powiązane z nowymi parametrami.

Aby usługa Google Play mogła zrozumieć zdefiniowane przez Ciebie adnotacje i parametry wierności, plik bufora protokołu zawierający te definicje musi być połączony z plikiem APK gry razem z ustawieniami inicjowania. Musisz też podać w pakiecie APK wartości domyślne dla typowych kombinacji parametrów wierności, aby w interfejsie Google Play dane były dzielone według nich na segmenty. Więcej informacji znajdziesz w artykule Definiowanie poziomów jakości.

Narzut pamięci i procesora

Cała pamięć używana przez bibliotekę Tuning Fork jest przydzielana w trakcie inicjowania gry. Rozmiar danych zależy od liczby kluczy instrumentów, liczby możliwych adnotacji i liczby zasobników na każdym histogramie. Jest to wielokrotność tych wartości 4 bajtów na każdy zasobnik. Dostępne są też 2 kopie wszystkich histogramów, które można przesłać jako podwójnie buforowane.

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

Wywołanie funkcji tick nie wymaga wiele przetwarzania. Funkcja ta po prostu oblicza indeks do tablicy histogramów i zwiększa liczbę całkowitą.

Integrowanie biblioteki Tuning Fork

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