Warstwa HAL kompozytora sprzętowego (HWC) określa najbardziej wydajny sposób łączenia buforów za pomocą dostępnego sprzętu. Jako HAL jest on implementowany w sposób specyficzny dla urządzenia i zwykle przez producenta sprzętu wyświetlacza.
Wartość tego podejścia jest łatwa do rozpoznania, gdy weźmiesz pod uwagę warstwy nakładki, które łączą wiele buforów w sprzęcie wyświetlacza, a nie w procesorze graficznym. Weźmy na przykład typowy telefon z Androidem w orientacji pionowej, z paskiem stanu u góry, paskiem nawigacyjnym u dołu i treścią aplikacji w pozostałych miejscach. Zawartość każdej warstwy znajduje się w osobnych buforach. Kompozycję możesz obsługiwać za pomocą jednej z tych metod:
- Renderowanie treści aplikacji w buforze roboczym, a następnie renderowanie paska stanu, paska nawigacyjnego i przekazywanie bufora roboczego do sprzętu wyświetlającego.
- Przekazywanie wszystkich 3 buforów do sprzętu wyświetlającego i instruowanie go, aby odczytywał dane z różnych buforów dla różnych części ekranu.
To drugie podejście może być znacznie bardziej wydajne.
Możliwości procesorów wyświetlania znacznie się różnią. Liczba nakładek, możliwość obracania lub mieszania warstw oraz ograniczenia dotyczące pozycjonowania i nakładania się mogą być trudne do wyrażenia za pomocą interfejsu API. Aby uwzględnić te opcje, HWC wykonuje te obliczenia:
- SurfaceFlinger przekazuje HWC pełną listę warstw i pyta: „Jak chcesz to obsłużyć?”.
- HWC odpowiada, oznaczając każdą warstwę jako kompozycję urządzenia lub klienta.
- SurfaceFlinger obsługuje każdego klienta, przekazując bufor wyjściowy do HWC, a HWC zajmuje się resztą.
Dostawcy sprzętu mogą dostosowywać kod decyzyjny, dzięki czemu można uzyskać najlepszą wydajność na każdym urządzeniu.
Nakładki mogą być mniej wydajne niż kompozycja GL, gdy nic na ekranie się nie zmienia. Dotyczy to zwłaszcza sytuacji, gdy treści nakładki mają przezroczyste piksele, a nakładające się warstwy są mieszane. W takich przypadkach HWC może poprosić o kompozycję GLES dla niektórych lub wszystkich warstw i zachować bufor kompozycji. Jeśli SurfaceFlinger poprosi o komponowanie tego samego zestawu buforów, HWC może wyświetlić wcześniej skomponowany bufor roboczy. Może to wydłużyć czas pracy urządzenia na baterii, gdy jest ono nieużywane.
Urządzenia z Androidem zwykle obsługują 4 warstwy nakładki. Próba połączenia większej liczby warstw niż nakładek powoduje, że system używa do niektórych z nich kompozycji GLES, co oznacza, że liczba warstw używanych przez aplikację może mieć mierzalny wpływ na zużycie energii i wydajność.