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.