Spis treści
Po co mierzyć liczbę klatek na sekundę (FPS) w systemach wbudowanych?
Pomiar liczby klatek na sekundę (FPS) w systemach wbudowanych pozwala ocenić, jak responsywny i płynny jest interfejs użytkownika w rzeczywistych warunkach sprzętowych. Daje to prosty i porównywalny wskaźnik, który ułatwia wykrywanie problemów z wydajnością, ocenę optymalizacji oraz walidację, czy system spełnia wymagania sprzętowe.
W praktyce wskaźnik FPS często służy jako szybki sygnał zwrotny podczas tworzenia aplikacji – wskazuje na problemy związane z obciążeniem procesora, przepustowością pamięci czy wydajnością wyświetlacza. Chociaż nie oddaje to pełnego obrazu sytuacji, to jest przydatnym punktem wyjścia do zrozumienia i poprawy ogólnej wydajności interfejsu użytkownika.
Jak zmierzyć liczbę klatek na sekundę (FPS) w systemach wbudowanych?
Pomiar liczby klatek na sekundę (FPS) w systemach wbudowanych nie jest tak prosty jak w środowiskach stacjonarnych. Zazwyczaj nie ma tam wbudowanego profilera, liczników GPU ani ustandaryzowanego potoku renderowania. Zamiast tego liczbę klatek na sekundę trzeba wyliczyć na podstawie tego, jak i kiedy ekran jest faktycznie odświeżany.
W praktyce pomiar FPS sprowadza się do odpowiedzi na jedno pytanie:
Jak często system generuje w pełni renderowaną ramkę?
Odpowiedź zależy od stosu graficznego, modelu renderowania i interfejsu wyświetlacza.
Co oznacza termin „ramka” w kontekście systemów wbudowanych?
Zanim zaczniesz mierzyć liczbę klatek na sekundę (FPS), warto najpierw wyjaśnić, czym jest „ramka”.
W systemach wbudowanych termin „ramka” może oznaczać:
- pełna aktualizacja bufora ramki (często spotykana w podwójnym buforowaniu)
- częściowa aktualizacja (tylko zabrudzone obszary)
- wyświetlacz flush (przenieś na wyświetlacz)
Z tego powodu FPS może wynosić:
- Render FPS – jak często rysowany jest interfejs użytkownika
- display FPS – jak często pikseli są wysyłane do wyświetlacza
Nie zawsze to jedno i to samo.
W tym przykładzie skupimy się na liczbie klatek na sekundę (FPS) podczas renderowania.
STM32 / Bare metal (podejście ogólne)
W systemach MCU (np. STM32) liczbę klatek na sekundę (FPS) często mierzy się za pomocą timera lub licznika cykli.
Podejście:
- zwiększ licznik ramek na końcu pętli renderowania
- zmierzyć upływający czas za pomocą SysTicka lub licznika cykli DWT
volatile uint32_t frame_count = 0;
void render_frame(void)
{
// draw UI
frame_count++;
}
A potem w zadaniu cyklicznym:
void fps_task(void)
{
static uint32_t last = 0;
uint32_t now = HAL_GetTick();
if (now – last >= 1000) {
printf(„FPS: %lun”, frame_count);
frame_count = 0;
last = now;
}
}
Co to mierzy:
- render FPS
Alternatywa (bardziej precyzyjna):
Użyj rejestru DWT (>) CYCCNT, żeby zmierzyć dokładny czas trwania ramki w cyklach procesora.
Bardziej precyzyjnym sposobem pomiaru liczby klatek na sekundę (FPS) na STM32 (i ogólnie na procesorach Cortex-M) jest użycie licznika cykli DWT (DWT->CYCCNT), który zlicza cykle zegara procesora zamiast opierać się na milisekundowych impulsach systemowych.
Jak to działa:
Na początku ramki zapisujesz aktualną wartość CYCCNT. Na końcu ramki odczytujesz ją ponownie i obliczasz różnicę. W ten sposób otrzymujesz dokładną liczbę cykli procesora zużytych na renderowanie pojedynczej ramki. Znając częstotliwość procesora, możesz obliczyć FPS:
FPS = częstotliwość procesora / liczba cykli na klatkę
Zalety:
- Bardzo wysoka precyzja (dokładność na poziomie cyklu)
- Idealne do analizy wydajności i optymalizacji
- Nie ma na to wpływu ani przerwania SysTick, ani wahania harmonogramu
Wady:
- Wymaga znanej i stabilnej częstotliwości taktowania procesora
- Nie jest dostępne we wszystkich rdzeniach Cortex-M (np. M0/M0+)
- Trochę bardziej skomplikowane w konfiguracji i obsłudze
- Przy dłuższych pomiarach trzeba wziąć pod uwagę przepełnienie licznika
Monitor wydajności LVGL (LV_USE_PERF_MONITOR)
LVGL oferuje wbudowaną funkcję monitorowania wydajności poprzez włączenie opcji LV_USE_PERF_MONITOR w pliku konfiguracyjnym (lv_conf.h). Po włączeniu tej opcji LVGL wyświetla na ekranie niewielką nakładkę z danymi w czasie rzeczywistym.
Zazwyczaj obejmuje to:
- FPS (ramki na sekundę)
- Wykorzystanie procesora (czas poświęcony na zadania LVGL)
- czasem dane dotyczące pamięci (w zależności od konfiguracji)
Wyświetlacz działa w ten sposób, że śledzi, jak często uruchamia się pętla renderowania oraz ile czasu zajmuje przetwarzanie zadań i rysowanie.
Co to mierzy:
- połączenie liczby render FPS i obciążenia systemu
- bardziej dotyczy „wydajności interfejsu użytkownika” niż samej liczby display FPS na wyświetlaczu
Dlaczego to się przydaje:
- konfiguracja bez żadnego wysiłku (wystarczy włączyć w pliku konfiguracyjnym)
- natychmiastowa wizualna informacja zwrotna podczas tworzenia
- świetnie nadaje się do szybkiej walidacji działania i testów regresyjnych
Ograniczenia:
- nie mierzy rzeczywistego czasu wyświetlania (od wysłania do pojawienia się na ekranie)
- W przypadku korzystania z częściowego odświeżania liczba klatek na sekundę (FPS) może nie odzwierciedlać aktualizacji na całym ekranie
- powoduje niewielki narzut (w środowisku produkcyjnym lepiej to wyłączyć)
W praktyce LV_USE_PERF_MONITOR to najszybszy sposób na zorientowanie się, jak działa system, ale do precyzyjnych pomiarów – zwłaszcza przy optymalizacji przepustowości czy sterowników wyświetlaczy – warto połączyć go z pomiarami na niższym poziomie (np. mierzeniem czasu wykonania flush callbacków).
LVGL oferuje wbudowaną funkcję monitorowania wydajności poprzez włączenie opcji LV_USE_PERF_MONITOR w pliku konfiguracyjnym (lv_conf.h). Po włączeniu tej opcji LVGL wyświetla na ekranie niewielką nakładkę z danymi w czasie rzeczywistym.
Zazwyczaj obejmuje to:
- FPS (klatki na sekundę)
- Wykorzystanie procesora (czas poświęcony na zadania LVGL)
- czasem dane dotyczące pamięci (w zależności od konfiguracji)
Wyświetlacz działa w ten sposób, że śledzi, jak często uruchamia się pętla renderowania oraz ile czasu zajmuje przetwarzanie zadań i rysowanie.
Co to mierzy:
- połączenie liczby render FPS i obciążenia systemu
- bardziej dotyczy „wydajności interfejsu użytkownika” niż samej liczby display FPS na wyświetlaczu
Dlaczego to się przydaje:
- konfiguracja bez żadnego wysiłku (wystarczy włączyć w pliku konfiguracyjnym)
- natychmiastowa wizualna informacja zwrotna podczas tworzenia
- świetnie nadaje się do szybkiej walidacji działania i testów regresyjnych
Ograniczenia:
- nie mierzy rzeczywistego czasu wyświetlania (od wysłania do pojawienia się na ekranie)
- W przypadku korzystania z częściowego odświeżania liczba klatek na sekundę (FPS) może nie odzwierciedlać zmian na całym ekranie
- powoduje niewielki narzut (w środowisku produkcyjnym najlepiej to wyłączyć)
W praktyce LV_USE_PERF_MONITOR to najszybszy sposób na zorientowanie się, jak działa system, ale do precyzyjnych pomiarów – zwłaszcza przy optymalizacji przepustowości czy sterowników wyświetlacza – warto połączyć to z pomiarami na niższym poziomie (np. mierząc flush callbacks).


MPU/Linux
W systemach Linux pomiar FPS zależy od stosu graficznego.
Prosty bufor ramki (fbdev)
Zmierz czas między zmianami bufora:
clock_gettime(CLOCK_MONOTONIC, &t1);
// render + memcpy to framebuffer
clock_gettime(CLOCK_MONOTONIC, &t2);
Wayland / frameworki GUI
Dostępne opcje to:
- wbudowane narzędzia (np. licznik FPS Weston)
- czas działania aplikacji
- Profiler GPU (jeśli są dostępne)
Wnioski
Pomiar liczby klatek na sekundę (FPS) w systemach wbudowanych wymaga zrozumienia, co właściwie oznacza pojęcie „klatka” w danym potoku przetwarzania. Niezależnie od tego, czy mierzysz pętle renderowania, flush callbacks, czy zamiany buforów, każda z tych metod odzwierciedla inny aspekt wydajności. Frameworki takie jak LVGL czy stosy oparte na systemie Linux oferują przydatne punkty zaczepienia, ale to programista musi wybrać odpowiedni punkt pomiaru.
W praktyce sama liczba klatek na sekundę (FPS) to za mało. Na postrzeganą wydajność często większy wpływ mają: stały czas wyświetlania ramki, opóźnienie oraz przepustowość pamięci. Stabilna i przewidywalna liczba klatek na sekundę jest zazwyczaj ważniejsza niż osiągnięcie jak najwyższej liczby klatek na sekundę.
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!



