Spis treści
Dlaczego warto optymalizować zasoby graficzne?
Optymalizacja zasobów graficznych w systemach wbudowanych polega przede wszystkim na znalezieniu równowagi między jakością obrazu a ograniczonymi zasobami systemowymi. W przeciwieństwie do środowisk stacjonarnych lub mobilnych platformy wbudowane – zwłaszcza te oparte na mikrokontrolerach (MCU) – działają w warunkach ścisłych ograniczeń dotyczących pamięci RAM, pamięci masowej, mocy przetwarzania i przepustowości pamięci. Nawet w przypadku bardziej wydajnych systemów opartych na procesorach MPU lub systemie Linux zasoby te nie są nieograniczone i mogą szybko stać się wąskim gardłem podczas obsługi złożonych interfejsów użytkownika.
Z tego powodu zasoby graficzne, takie jak obrazy, czcionki i animacje, nie mogą być traktowane jako elementy „dodatkowe”. Ich rozmiar, format i struktura mają bezpośredni wpływ na wydajność systemu, szybkość działania, a czasem nawet na wykonalność produktu. Optymalizacja nie jest zatem opcjonalnie wykonywanym etapem udoskonalania, lecz fundamentalną częścią projektowania wbudowanych GUI.
W praktyce optymalizacja zasobów polega na zmniejszeniu zajętości pamięci, zminimalizowaniu transferu danych oraz obniżeniu kosztów renderowania, przy jednoczesnym zachowaniu akceptowalnej jakości wizualnej. Konkretne techniki i priorytety zależą od platformy docelowej i jej głównych wąskich gardeł, co zostanie omówione bardziej szczegółowo w niniejszym artykule.
Poniżej przedstawiono kilka popularnych metod optymalizacji zasobów graficznych:
- Zmniejszenie głębi kolorów
- Kompresja zasobów
- Wstępne renderowanie i spłaszczanie
- Optymalizacja rozdzielczości i skalowania
- Częściowe odświeżanie
- Strumieniowanie zasobów z pamięci zewnętrznej
Zmniejszenie głębi kolorów
Zmniejszenie formatu piksela (np. ARGB8888 → RGB565, L8, A4) jest jednym z najskuteczniejszych sposobów na zmniejszenie zużycia pamięci i przepustowości. Mniejsza liczba bitów na piksel przekłada się bezpośrednio na mniejszy rozmiar zasobów i szybszy transfer do bufora ramki.
Technika ta ma szczególne znaczenie w przypadku mikrokontrolerów (MCU), gdzie przepustowość zarówno pamięci RAM, jak i pamięci flash jest ograniczona. Nawet w systemach z procesorami (MPU) może ona znacznie zmniejszyć nacisk na przepustowość w aplikacjach intensywnie wykorzystujących interfejs użytkownika.
Głównym kompromisem jest obniżona jakość obrazu – przede wszystkim pasmowanie barw i ograniczona precyzja kanału alfa.
Najlepsze gdy:
- Ograniczeniem jest rozmiar pamięci RAM lub bufora ramki
- przepustowość wyświetlacza stanowi wąskie gardło
Kompresja zasobów
Kompresja zmniejsza ilość miejsca zajmowanego przez zasoby graficzne, co pozwala na zmieszczenie większej ilości treści w ograniczonej pamięci. Typowe metody obejmują zarówno proste algorytmy RLE, jak i schematy oparte na algorytmie LZ lub formaty przeznaczone specjalnie dla obrazów.
W mikrokontrolerach kompresja jest często konieczna ze względu na ograniczoną pojemność pamięci Flash. Jednak dekompresja powoduje narzut procesora i czasami wymaga użycia buforów tymczasowych w pamięci RAM.
Kluczową decyzją projektową jest znalezienie równowagi między oszczędnością miejsca na dysku a kosztami związanymi z czasem wykonania programu.
Najlepsze gdy:
- Pamięć flash/pojemność pamięci jest ograniczona
- Procesor dysponuje wystarczającym zapasem mocy obliczeniowej dla dekompresji
Wstępne renderowanie i spłaszczanie
Zamiast renderować złożone elementy interfejsu użytkownika (przejścia kolorów, cienie, efekty) w czasie wykonania, można je przeprowadzić w formie wstępnego renderowania do postaci statycznych bitmap. Dzięki temu obciążenie przenoszone jest z procesora na pamięć masową.
Jest to powszechne podejście w systemach opartych na MCU bez przyspieszenia przez procesor graficzny (GPU), w których kluczowe znaczenie ma przewidywalny czas renderowania.
Kompromis polega na wzroście wykorzystania technologii Flash oraz malejących poziomach elastyczności – każda zmiana wizualna wymaga ponownego wygenerowania zasobów.
Najlepsze gdy:
- Procesor stanowi wąskie gardło
- Interfejs użytkownika jest w większości statyczny
Optymalizacja rozdzielczości i skalowania
Wykorzystanie zasobów o rozdzielczości odpowiadającej docelowej pozwala uniknąć skalowania w czasie wykonania, co może być kosztowne pod względem obciążenia procesora lub przepustowości pamięci.
W systemach o ograniczonych zasobach nawet proste operacje skalowania mogą negatywnie wpływać na wydajność, zwłaszcza gdy są stosowane do wielu elementów interfejsu użytkownika w każdej ramce.
Przygotowanie zasobów w dokładnej rozdzielczości (lub w ograniczonym zakresie rozdzielczości) gwarantuje przewidywalną wydajność i mniejsze zużycie zasobów.
Najlepsze gdy:
- Ograniczona wydajność procesora lub przepustowość
- Układ interfejsu użytkownika jest stały lub przewidywalny
Częściowe odświeżanie
Zamiast odświeżać cały ekran w każdej ramce, aktualizowane są jedynie te obszary, w których nastąpiły zmiany. Pozwala to znacznie zmniejszyć ilość danych przesyłanych do wyświetlacza w każdej ramce.
W wielu systemach wbudowanych głównym wąskim gardłem jest przepustowość pamięci, a nie procesor. Częściowe odświeżanie bezpośrednio rozwiązuje ten problem poprzez zminimalizowanie transferu pikseli. Zastosowanie częściowego odświeżania zmniejsza zapotrzebowanie na przepustowość pamięci, a także może zmniejszyć obciążenie procesora, o ile nie jest on ponownie angażowany do obsługi „dirty region”, które ulegają częstszym zmianom.
Zarówno TouchGFX, jak i LVGL realizują tę koncepcję wewnętrznie za pomocą obszarów „dirty region” lub unieważnionych.
Najlepsze gdy:
- przepustowość interfejsu wyświetlacza jest ograniczona (SPI, RGB itp.)
- Zmiany w interfejsie użytkownika są zlokalizowane
Strumieniowanie zasobów z pamięci zewnętrznej
Strumieniowanie zasobów z pamięci zewnętrznej oznacza dostęp do zasobów interfejsu użytkownika (takich jak obrazy, czcionki czy animacje) bezpośrednio z pamięci nieulotnej (np. zewnętrznej pamięci Flash, QSPI lub systemu plików) w czasie wykonania programu, bez konieczności ich trwałego kopiowania do pamięci RAM.
Zamiast wstępnie ładować całe zasoby, system odczytuje tylko niezbędne fragmenty danych w razie potrzeby i przeprowadza przetwarzanie lub renderowanie na bieżąco. Pozwala to znacznie zmniejszyć zużycie pamięci RAM, a jednocześnie umożliwia korzystanie ze złożonej grafiki i dużych zestawów zasobów.
Technika ta jest powszechnie stosowana w systemach wbudowanych o ograniczonej pamięci, umożliwiając tworzenie rozbudowanych interfejsów użytkownika dzięki wykorzystaniu przepustowości pamięci zewnętrznej zamiast polegania na ograniczonej pamięci RAM.
Głównym ograniczeniem jest szybkość dostępu – przepustowość pamięci zewnętrznej i opóźnienia mogą stać się wąskim gardłem.
Najlepsze gdy:
- Pamięć RAM jest bardzo ograniczona
- aktywa są duże lub liczne
Podsumowanie
W praktyce optymalizacja zasobów graficznych nie polega tyle na zastosowaniu jednej techniki, co na wyborze odpowiedniej kombinacji w oparciu o ograniczenia systemowe. Każda metoda dotyczy innego wąskiego gardła – czy to pamięci RAM, pojemności pamięci Flash, obciążenia procesora, czy przepustowości pamięci – a poprawa w jednym obszarze często wiąże się z pogorszeniem wyników w innym.
W systemach opartych na MCU nacisk kładzie się zazwyczaj na minimalizację zużycia pamięci i przepustowości: niezbędne jest często zmniejszenie głębi kolorów, stosowanie kompresji, strumieniowanie zasobów oraz korzystanie z częściowego odświeżania ekranu. Na platformach MPU/Linux, mimo że zasoby są mniej ograniczone, podobne techniki nadal mają znaczenie – zwłaszcza w aplikacjach z rozbudowanym interfejsem użytkownika, gdzie przepustowość i wydajność pamięci podręcznej mogą ograniczać wydajność.
Najważniejsze jest wczesne zidentyfikowanie głównego wąskiego gardła i odpowiednia optymalizacja. W wielu rzeczywistych wbudowanych GUI okazuje się, że jest to raczej przepustowość pamięci niż sama wydajność procesora. Zrozumienie tego pomaga w podejmowaniu decyzji dotyczących np. wyboru formatu piksela, strategii odświeżania oraz struktury zasobów.
Ostatecznie skuteczna optymalizacja sprowadza się do kompromisów. Nie ma jednego, uniwersalnie optymalnego podejścia – istnieją jedynie rozwiązania, które najlepiej pasują do danej platformy sprzętowej, złożoności interfejsu użytkownika oraz docelowej wydajności.
ODKRYJ NASZĄ
Whitepaper
Osiągnij idealną interakcję użytkownika z wyświetlaczem dzięki odpowiedniemu czujnikowi Touch Sensor IC. Czy kiedykolwiek zmagałeś się z problemami związanymi z fantomowymi dotknięciami lub certyfikacją? Rozwiń swoje prace B+R jak profesjonalista dzięki naszemu Whitepaperowi!



