Buffering frame kamera

Ditambahkan di ARCore 1.17.0

Sebagian besar aplikasi hanya perlu melakukan buffering pada satu frame kamera untuk rendering. Namun, ARCore juga mendukung buffering beberapa frame kamera dalam ukuran tetap antrean tekstur round-robin.

Aplikasi dengan pipeline rendering multi-thread dapat menggunakan buffering untuk membantu meningkatkan kualitas performa rendering. Buffering juga dapat membantu aplikasi merender frame dengan kecepatan frame yang konsisten, yang dapat mengurangi ketersendatan visual yang disebabkan oleh rendering UI lambat.

Prasyarat

Buffering gambar kamera diaktifkan dalam salah satu kondisi berikut:

  1. Saat diaktifkan oleh aplikasi dengan memanggil Session.setCameraTextureNames(ids) dengan beberapa ID tekstur.

  2. Saat satu atau beberapa fitur ARCore yang memerlukan buffering internal . Saat ini, fitur tersebut mencakup:

    • Gambar Augmented
    • Tampilan Augmented
  3. Pada perangkat yang didukung ARCore tertentu yang memerlukan buffering internal untuk beroperasi dengan benar.

Menentukan apakah penundaan frame diaktifkan

Untuk menentukan apakah perangkat dan sesi AR tertentu memiliki buffering frame (juga (dikenal sebagai delay frame), gunakan output logcat 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.

Memori

Setiap frame kamera tambahan yang di-buffer meningkatkan penggunaan memori. Misalnya, tekstur 1080p mengkonsumsi sekitar 6 MB memori (diperoleh dengan mengalikan sebuah resolusi 1920 x 1080 dengan tiga byte data RGB per piksel).

Pertimbangan performa

Menggunakan beberapa {i>frame<i} kamera tidak dijamin dapat mengurangi variabilitas kecepatan frame, dan penggunaan pipeline rendering multi-thread tidak dijamin memberikan performa yang lebih baik dalam segala situasi. Faktor-faktor berikut memengaruhi performa di dunia nyata:

  • Pipeline rendering aplikasi

  • Model threading aplikasi

  • Arsitektur CPU perangkat

  • Sistem penjadwalan sistem operasi

Jika aplikasi Anda tidak dapat memanfaatkan frame kamera tambahan, tidak ada keunggulan performa dalam menggunakan lebih dari satu tekstur.

Aktifkan buffering

Untuk menginstruksikan ARCore tentang tekstur yang akan digunakan untuk melakukan buffering frame kamera yang masuk, gunakan Session.setCameraTextureNames(ids) untuk menyediakan array yang berisi satu atau beberapa ID tekstur. Fungsi ini hanya dipanggil setelah pembuatan sesi, dan biasanya hanya dipanggil sekali.

Selama setiap panggilan ke Session.update(), ARCore akan menimpa tekstur berikutnya di antrean dalam urutan {i>round-robin<i}. Jika aplikasi Anda hanya menetapkan satu ID tekstur, tekstur yang sama akan ditimpa setiap saat.

Gunakan Frame.getCameraTextureName() untuk menentukan ID tekstur yang terkait dengan {i>frame<i} saat ini.