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.