Ramki do buforowania

Dodano w ARCore 1.17.0

Większość aplikacji do renderowania potrzebuje buforowania tylko 1 klatki aparatu. ARCore obsługuje jednak również buforowanie wielu klatek z aparatu w kolejce tekstur o stałym rozmiarze i rotacji.

Aplikacje z wielowątkowym potokiem renderowania mogą używać buforowania, aby poprawić wydajność renderowania. Buforowanie może też ułatwić aplikacjom renderowanie klatek z bardziej spójną liczbą klatek, co może ograniczyć zacinanie się obrazu spowodowane powolnym renderowaniem interfejsu.

Warunki wstępne

Buforowanie zdjęć z aparatu włącza się w każdym z tych warunków:

  1. Gdy funkcja jest włączona przez aplikację, wywołując Session.setCameraTextureNames(ids) z wieloma identyfikatorami tekstur.

  2. Gdy włączona jest co najmniej jedna funkcja ARCore, która wymaga buforowania wewnętrznego. Obecnie obejmuje to te funkcje:

    • Obrazy rozszerzone
    • Rozszerzone twarze
  3. Na niektórych urządzeniach obsługujących ARCore, które do prawidłowego działania wymagają buforowania wewnętrznego.

Sprawdzanie, czy opóźnienie klatek jest włączone

Aby sprawdzić, czy dane urządzenie i sesja AR mają włączone buforowanie klatek (opóźnienie klatek), użyj danych wyjściowych logcat narzędzia adb:

# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 6 frames.

… I native  : session.cc:3141 Update Frame Delay to 4 frames.

… I native  : session.cc:3141 Update Frame Delay to 2 frames.

Pamięć

Każda dodatkowa buforowana ramka kamery zwiększa wykorzystanie pamięci. Na przykład tekstura 1080p zajmuje około 6 MB pamięci (można to uzyskać, mnożąc rozdzielczość 1920 x 1080 przez 3 bajty danych RGB na piksel).

Możliwe spowolnienie działania witryny

Korzystanie z kilku klatek aparatu nie gwarantuje, że zmienność liczby klatek się zmniejszy. Użycie wielowątkowego potoku renderowania nie gwarantuje uzyskania lepszej wydajności w każdej sytuacji. Na rzeczywistą wydajność wpływają te czynniki:

  • Potok renderowania aplikacji

  • Model podziału na wątki

  • Architektura procesora urządzenia

  • system planowania w systemie operacyjnym,

Jeśli aplikacja nie obsługuje dodatkowych ramek aparatu, użycie więcej niż 1 tekstury nie będzie miało wpływu na wydajność.

Włącz buforowanie

Aby poinstruować ARCore, które tekstury mają używać do buforowania przychodzących klatek aparatu, użyj parametru Session.setCameraTextureNames(ids), aby udostępnić tablicę z co najmniej 1 identyfikatorem tekstur. Ta funkcja jest wywoływana dopiero po utworzeniu sesji i zwykle tylko raz.

Podczas każdego wywołania Session.update() ARCore zastępuje następną teksturę w kolejce w sekwencji rotacyjne. Jeśli aplikacja ustawia tylko 1 identyfikator tekstury, za każdym razem ta sama tekstura będzie zastępowana.

Użyj Frame.getCameraTextureName(), aby określić identyfikator tekstury powiązany z bieżącą ramką.