Buffering frame kamera

Ditambahkan di ARCore 1.17.0

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

Aplikasi dengan pipeline rendering multi-thread dapat menggunakan buffering untuk membantu meningkatkan performa rendering. Buffering juga dapat membantu aplikasi merender frame pada kecepatan frame yang lebih konsisten, yang dapat mengurangi ketersendatan visual yang disebabkan oleh rendering UI yang 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 diaktifkan. Saat ini, fitur tersebut mencakup:

    • Gambar Augmented
    • Augmented Face
  3. Pada perangkat yang didukung ARCore tertentu yang memerlukan buffering internal agar dapat beroperasi dengan benar.

Menentukan apakah penundaan frame diaktifkan atau tidak

Untuk menentukan apakah perangkat dan sesi AR tertentu mengaktifkan buffering frame (juga dikenal sebagai penundaan 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 akan meningkatkan penggunaan memori. Misalnya, tekstur 1080p menghabiskan memori sekitar 6 MB (diperoleh dengan mengalikan resolusi 1920 x 1080 dengan tiga byte data RGB per piksel).

Pertimbangan performa

Menggunakan beberapa frame kamera tidak dijamin akan mengurangi variabilitas kecepatan frame, dan menggunakan pipeline rendering multi-thread tidak dijamin akan memberikan performa yang lebih baik dalam segala situasi. Faktor-faktor berikut memengaruhi performa sebenarnya:

  • Pipeline rendering aplikasi

  • Model threading aplikasi

  • Arsitektur CPU perangkat

  • Sistem penjadwalan sistem operasi

Jika aplikasi Anda tidak dapat memanfaatkan frame kamera tambahan, penggunaan lebih dari satu tekstur tidak akan meningkatkan performa.

Aktifkan buffering

Untuk menginstruksikan ARCore mengenai tekstur yang akan digunakan untuk mem-buffer frame kamera masuk, gunakan Session.setCameraTextureNames(ids) untuk memberikan array dari 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 dalam antrean secara berurutan. Jika aplikasi Anda hanya menetapkan satu ID tekstur, tekstur yang sama akan ditimpa setiap kali dibutuhkan.

Gunakan Frame.getCameraTextureName() untuk menentukan ID tekstur yang terkait dengan frame saat ini.