Zarządzanie wynikami

Zarządzanie mocą i wydajnością urządzeń z Androidem może pomóc zapewnić płynne działanie aplikacji na różnych urządzeniach. W Androidzie 7.0 i nowszych producenci OEM mogą wdrożyć obsługę wskazówek dotyczących trwałej wydajności, które umożliwiają aplikacjom utrzymywanie spójnej wydajności urządzenia i wyznaczanie rdzenia do wyłącznego użytku w przypadku aplikacji na pierwszym planie, które intensywnie korzystają z procesora.

Utrzymywanie wydajności

W przypadku aplikacji długo działających (gier, aparatu, RenderScript, przetwarzania audio) wydajność może się znacznie zmieniać, gdy osiągane są limity temperatury urządzenia i ograniczają one działanie procesora. Deweloperzy aplikacji, którzy tworzą wydajne aplikacje o długim czasie działania, są ograniczeni, ponieważ możliwości platformy bazowej są zmienne, gdy urządzenie zaczyna się nagrzewać.

Aby rozwiązać te ograniczenia, w Androidzie 7.0 wprowadzono obsługę ciągłej wydajności, co umożliwia producentom OEM przekazywanie wskazówek dotyczących możliwości urządzenia w przypadku długo działających aplikacji. Deweloperzy aplikacji mogą korzystać z tych wskazówek, aby dostosować aplikacje w celu zapewnienia przewidywalnego i stalego poziomu wydajności urządzenia przez długi czas.

Architektura

Aplikacja na Androida może poprosić platformę o wejście w tryb ciągłej wydajności, w którym urządzenie z Androidem może utrzymać stały poziom wydajności przez dłuższy czas.

Rysunek 1. Architektura trybu ciągłej wydajności

Implementacja

Aby zapewnić stabilną wydajność w Androidzie 7.0 i nowszych, producenci OEM muszą:

  • Wprowadź zmiany w interfejsie HAL dotyczącego zasilania, aby zablokować maksymalne częstotliwości procesora lub karty graficznej lub przeprowadzić inne optymalizacje w celu zapobiegania ograniczaniu ze względu na temperaturę.
  • Wdroż nowy podpowiedź POWER_HINT_SUSTAINED_PERFORMANCE w interfejsie HAL.
  • Zadeklaruj obsługę, zwracając wartość TRUE za pomocą interfejsu API isSustainedPerformanceModeSupported().
  • Wdróż Window.setSustainedPerformanceMode.

W implementacji referencyjnej Nexusa wskazówka dotycząca zasilania ogranicza maksymalne częstotliwości procesora i GPU do najwyższych możliwych poziomów. Pamiętaj, że obniżenie paska MAX w częstotliwości procesora lub karty graficznej spowoduje zmniejszenie liczby klatek, ale w tym trybie preferowana jest niższa częstotliwość ze względu na jej trwałość. Na przykład urządzenie korzystające z normalnych maksymalnych zegarów może renderować z częstotliwością 60 FPS przez kilka minut, ale po rozgrzaniu może ograniczyć częstotliwość do 30 FPS do końca 30 minut. W trybie ciągłym urządzenie może na przykład renderować obraz z jednolitą szybkością 45 FPS przez 30 minut. Celem jest zapewnienie takiej częstotliwości klatek, która jest równa (lub wyższa) częstotliwości klatek w przypadku nieużywania trybu, a także jest stała w czasie, aby deweloperzy nie musieli ścigać ruchomego celu.

Zdecydowanie zalecamy wdrożenie trybu ciągłego, aby urządzenie osiągało najwyższą możliwą wydajność ciągłą, a nie tylko minimalne wartości wymagane do przejścia testu (np. wybierz najwyższe możliwe limity częstotliwości, które nie powodują przegrzewania się urządzenia w czasie).

Uwaga: nie trzeba ograniczać częstotliwości zegara MAX, aby wdrożyć tryb ciągły.

Weryfikacja

Producenci OEM mogą użyć testu CTS (Android 7.0 lub nowszy) do sprawdzenia implementacji interfejsu API dotyczącego wydajności. Test wykonuje obciążenie przez około 30 minut i porównuje wydajność z włączonym i wyłączonym trybem ciągłym:

  • W trybie ciągłym liczba klatek musi pozostać stosunkowo stała (test mierzy procentową zmianę liczby klatek w czasie i wymaga zmiany mniejszej niż 5%).
  • W trybie ciągłym częstotliwość klatek nie może być niższa niż częstotliwość klatek na koniec 30 minut, gdy tryb jest wyłączony.

Możesz też ręcznie przetestować implementację przy użyciu kilku obciążeń wymagających dużej mocy procesora i procesora graficznego, aby sprawdzić, czy urządzenie nie będzie ograniczać wydajności ze względu na temperaturę po 30 minutach użytkowania. Podczas testów wewnętrznych użyliśmy przykładowych obciążeń, w tym gier i aplikacji do testowania wydajności (np. gfxbench).

Rdzenie z wyjątkowym dostępem

W przypadku zadań wymagających dużej mocy obliczeniowej procesora i o krótkim czasie realizacji przejęcie kontroli przez inny wątek może przesączyć ramy czasowe. W przypadku aplikacji o wysokich wymaganiach dotyczących opóźnienia i częstotliwości odświeżania (np. aplikacji audio lub aplikacji do rzeczywistości wirtualnej) przydzielenie im dedykowanego rdzenia procesora może zapewnić akceptowalny poziom wydajności.

Urządzenia z Androidem 7.0 lub nowszym mogą teraz zarezerwować 1 rdzeń dla najważniejszej aplikacji na pierwszym planie, co poprawia wydajność wszystkich aplikacji na pierwszym planie i daje aplikacjom o wysokiej intensywności większe możliwości kontroli nad tym, jak ich zadania są przydzielane do poszczególnych rdzeni procesora.

Aby obsługiwać procesor wyłączny na urządzeniu:

  • Włącz cpusets i skonfiguruj cpuset, który zawiera tylko aplikację na pierwszym planie.
  • Upewnij się, że jedno jądro (to jest jądro wyłączne) jest zarezerwowane dla wątków z tego cpuset.
  • Aby zwrócić numer rdzenia z rdzenia wyłącznego, wdróż interfejs getExclusiveCores API.

Aby określić, które procesy są zaplanowane na poszczególnych rdzeniach, użyj opcji systrace podczas wykonywania dowolnego obciążenia i sprawdź, czy na rdzeniu z dostępem wyłącznym nie są zaplanowane żadne wątki z przestrzeni użytkownika z aplikacji innych niż główna aplikacja na pierwszym planie.

Aby wyświetlić implementację referencyjną na urządzeniu Nexus 6P, przejdź do android//device/huawei/angler/power/power.c.