เพิ่มใน ARCore 1.17.0
แอปส่วนใหญ่ต้องบัฟเฟอร์เฟรมกล้องเพียงเฟรมเดียวเพื่อการแสดงภาพ อย่างไรก็ตาม ARCore ยังรองรับการบัฟเฟอร์เฟรมกล้องหลายเฟรมในคิวพื้นผิวแบบกลมที่มีขนาดคงที่
แอปที่มีไปป์ไลน์การแสดงผลหลายเทรดจะใช้บัฟเฟอร์เพื่อช่วยปรับปรุงประสิทธิภาพการแสดงผลได้ บัฟเฟอร์ยังช่วยให้แอปแสดงผลเฟรมที่อัตราเฟรมคงที่มากขึ้นได้ ซึ่งจะลดภาพกระตุกที่เกิดจากการแสดงผล UI ช้า
เงื่อนไขเบื้องต้น
เปิดใช้การบัฟเฟอร์รูปภาพจากกล้องแล้วภายใต้เงื่อนไขใดๆ ต่อไปนี้
เมื่อแอปเปิดใช้ด้วยการเรียกใช้
Session.setCameraTextureNames(ids)
ด้วยรหัสพื้นผิวหลายรายการเมื่อเปิดใช้ฟีเจอร์ ARCore อย่างน้อย 1 รายการที่ต้องมีการบัฟเฟอร์ภายใน ปัจจุบันมีฟีเจอร์ดังต่อไปนี้
- รูปภาพเสริม
- Augmented Faces
ในอุปกรณ์ที่รองรับ ARCore บางรุ่นซึ่งต้องมีการบัฟเฟอร์ภายในเพื่อให้ทำงานได้อย่างถูกต้อง
ระบุว่าเปิดใช้การหน่วงเวลาเฟรมหรือไม่
หากต้องการตรวจสอบว่าอุปกรณ์หนึ่งๆ และเซสชัน AR เปิดใช้การบัฟเฟอร์เฟรม (หรือที่เรียกว่าการหน่วงเวลาเฟรม) อยู่หรือไม่ ให้ใช้เอาต์พุต 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.
หน่วยความจำ
เฟรมกล้องที่บัฟเฟอร์เพิ่มเติมแต่ละตัวจะเพิ่มการใช้งานหน่วยความจำ ตัวอย่างเช่น พื้นผิว 1080p ใช้หน่วยความจำประมาณ 6 MB (ได้มาคูณความละเอียด 1920 x 1080 คูณข้อมูล RGB 3 ไบต์ต่อพิกเซล)
ข้อพิจารณาด้านประสิทธิภาพ
เราไม่รับประกันว่าการใช้เฟรมกล้องหลายตัวจะลดความแปรปรวนของอัตราเฟรมได้ และไม่รับประกันว่าการใช้ไปป์ไลน์การแสดงผลแบบมัลติเธรดจะให้ประสิทธิภาพที่ดีขึ้นในทุกสถานการณ์ ปัจจัยต่อไปนี้มีผลต่อประสิทธิภาพในโลกจริง
ไปป์ไลน์การแสดงภาพแอป
โมเดล Threading ของแอป
สถาปัตยกรรม CPU ของอุปกรณ์
ระบบการกำหนดเวลาของระบบปฏิบัติการ
หากแอปของคุณไม่สามารถใช้กรอบกล้องเพิ่มเติม การใช้พื้นผิวมากกว่า 1 พื้นผิวก็จะไม่เกิดข้อได้เปรียบด้านประสิทธิภาพ
เปิดใช้การบัฟเฟอร์
หากต้องการกำหนด ARCore ที่จะใช้พื้นผิวเพื่อบัฟเฟอร์เฟรมกล้องขาเข้า ให้ใช้ Session.setCameraTextureNames(ids)
เพื่อระบุอาร์เรย์ของรหัสพื้นผิวอย่างน้อย 1 รายการ
ระบบจะเรียกใช้ฟังก์ชันนี้หลังจากการสร้างเซสชันเท่านั้น และโดยปกติจะเรียกเพียงครั้งเดียว
ระหว่างการเรียก Session.update()
แต่ละครั้ง ARCore จะเขียนทับพื้นผิวถัดไปในคิวตามลำดับการวนรอบ หากแอปกำหนดรหัสพื้นผิวเพียงรหัสเดียว
พื้นผิวเดียวกันจะถูกเขียนทับทุกครั้ง
ใช้ Frame.getCameraTextureName()
เพื่อระบุรหัสพื้นผิวที่เชื่อมโยงกับเฟรมปัจจุบัน