Zarządzanie wydajnością

Zarządzanie mocą i wydajnością urządzeń z Androidem może pomóc w zapewnieniu spójnego i płynnego działania aplikacji na szerokiej gamie sprzętu. W systemie Android 7.0 i nowszych wersjach producenci OEM mogą wdrożyć obsługę wskazówek dotyczących trwałej wydajności, które umożliwiają aplikacjom utrzymanie stałej wydajności urządzenia i określić ekskluzywny rdzeń w celu poprawy wydajności aplikacji działających na pierwszym planie intensywnie obciążających procesor.

Trwała wydajność

W przypadku długotrwałych aplikacji (gry, kamera, RenderScript , przetwarzanie dźwięku) wydajność może się znacznie różnić w miarę osiągnięcia limitów temperatury urządzenia i ograniczenia działania silników systemu na chipie (SoC). Twórcy aplikacji tworzący wydajne i długotrwałe aplikacje mają ograniczone możliwości, ponieważ możliwości podstawowej platformy stają się ruchomym celem, gdy urządzenie zaczyna się nagrzewać.

Aby rozwiązać te ograniczenia, w systemie Android 7.0 wprowadzono obsługę stałej wydajności, umożliwiając producentom OEM dostarczanie wskazówek dotyczących wydajności urządzenia w przypadku długotrwałych aplikacji. Twórcy aplikacji mogą skorzystać z tych wskazówek, aby dostroić aplikacje w celu uzyskania przewidywalnego, stałego poziomu wydajności urządzenia przez długi czas.

Architektura

Aplikacja na Androida może zażądać od platformy przejścia 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.

Realizacja

Aby zapewnić stałą wydajność systemu Android 7.0 i nowszych wersji, producenci OEM muszą:

  • Wprowadź specyficzne dla urządzenia zmiany w warstwie HAL zasilania, aby zablokować maksymalne częstotliwości procesora/GPU lub przeprowadzić inne optymalizacje, aby zapobiec dławieniu termicznemu.
  • Zaimplementuj nową wskazówkę POWER_HINT_SUSTAINED_PERFORMANCE w mocy HAL.
  • Zadeklaruj wsparcie, zwracając wartość TRUE za pośrednictwem interfejsu API isSustainedPerformanceModeSupported() .
  • Zaimplementuj Window.setSustainedPerformanceMode .

W referencyjnej implementacji Nexusa wskazówka dotycząca mocy ogranicza maksymalne częstotliwości procesora i procesora graficznego do najwyższych możliwych do utrzymania poziomów. Należy pamiętać, że obniżenie paska MAX w częstotliwości procesora/GPU obniży liczbę klatek na sekundę, ale ta niższa częstotliwość jest preferowana w tym trybie ze względu na trwałość. Na przykład urządzenie korzystające z normalnych maksymalnych zegarów może być w stanie renderować z szybkością 60 klatek na sekundę przez kilka minut, ale po nagrzaniu urządzenia może spaść do 30 klatek na sekundę pod koniec 30 minut. W trybie ciągłym urządzenie może na przykład renderować stale przy 45 FPS przez całe 30 minut. Celem jest, aby liczba klatek na sekundę podczas korzystania z trybu była tak wysoka (lub wyższa) niż liczba klatek na sekundę, gdy tryb nie jest używany, i stała w czasie, tak aby programiści nie musieli gonić ruchomego celu.

Zdecydowanie zalecamy wdrożenie trybu ciągłego, aby urządzenie osiągnęło najwyższą możliwą trwałą wydajność — a nie tylko minimalne wartości wymagane do zaliczenia testu (np. wybierz najwyższe możliwe ograniczenia częstotliwości MAX, które nie powodują z czasem termicznego dławienia urządzenia).

Uwaga : ograniczenie MAX częstotliwości taktowania nie jest wymagane do wdrożenia trybu ciągłego.

Walidacja

Producenci OEM mogą skorzystać z testu CTS (Android 7.0 i nowsze wersje), aby zweryfikować wdrożenie interfejsu API trwałej wydajności. Test uruchamia obciążenie przez około 30 minut i porównuje wydajność z włączonym trybem ciągłym i bez niego:

  • Po włączeniu trybu ciągłego liczba klatek na sekundę musi pozostać względnie stała (test mierzy procentową zmianę liczby klatek na sekundę w czasie i wymaga zmiany <5%).
  • Przy włączonym trybie ciągłym liczba klatek na sekundę nie może być niższa niż liczba klatek na sekundę na koniec 30 minut przy wyłączonym trybie.

Ponadto możesz ręcznie przetestować swoją implementację przy kilku obciążeniach intensywnie obciążających procesor i kartę graficzną, aby upewnić się, że urządzenie nie ulegnie dławieniu termicznemu po 30 minutach użytkowania. W testach wewnętrznych wykorzystaliśmy przykładowe obciążenia, w tym gry i aplikacje do testów porównawczych (np. gfxbench ).

Ekskluzywne rdzenie

W przypadku obciążeń intensywnie obciążających procesor i wrażliwych na czas, wywłaszczenie przez inny wątek może zadecydować o dotrzymaniu ostatecznych terminów realizacji ramek. W przypadku aplikacji, które mają rygorystyczne wymagania dotyczące opóźnień i liczby klatek na sekundę (takich jak aplikacje audio lub rzeczywistość wirtualna), posiadanie ekskluzywnego rdzenia procesora może zagwarantować akceptowalny poziom wydajności.

Urządzenia z systemem Android 7.0 lub nowszym mogą teraz jawnie zarezerwować jeden rdzeń dla aplikacji działającej na pierwszym planie, poprawiając wydajność wszystkich aplikacji na pierwszym planie i zapewniając aplikacjom o dużej intensywności obciążeń większą kontrolę nad sposobem alokacji ich pracy pomiędzy rdzenie procesora.

Aby obsługiwać ekskluzywny rdzeń na urządzeniu:

  • Włącz cpusets i skonfiguruj cpuset zawierający tylko aplikację na pierwszym planie.
  • Upewnij się, że jeden rdzeń (jest to rdzeń wyłączny) jest zarezerwowany dla wątków tego cpuset .
  • Zaimplementuj interfejs API getExclusiveCores, aby zwrócić numer rdzenia ekskluzywnego rdzenia.

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

Aby wyświetlić referencyjną implementację dla Nexusa 6P, przejdź do android//device/huawei/angler/power/power.c .