Skopiowano link do schowka!

Jak zmierzyć liczbę klatek na sekundę (FPS) w systemach wbudowanych

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!

    Przejdź do naszego katalogu produktów i zobacz, jak możesz oszczędzać dzięki jakości, nie na jakości.

    Skontaktuj się z nami już teraz, oszczędzaj dzięki jakości, nie na jakości.