Đang lưu khung máy ảnh vào bộ đệm

Đã thêm vào ARCore 1.17.0

Hầu hết các ứng dụng chỉ cần lưu vào bộ đệm một khung máy ảnh để kết xuất. Tuy nhiên, ARCore cũng hỗ trợ lưu vào bộ đệm nhiều khung máy ảnh trong hàng đợi hoạ tiết vòng tròn có kích thước cố định.

Các ứng dụng có quy trình kết xuất đa luồng có thể sử dụng bộ đệm để giúp cải thiện hiệu suất kết xuất. Việc lưu vào bộ đệm cũng có thể giúp các ứng dụng kết xuất khung hình ở tốc độ khung hình nhất quán hơn, qua đó giảm tình trạng giật hình ảnh do kết xuất giao diện người dùng chậm.

Điều kiện tiên quyết

Tính năng lưu hình ảnh vào bộ đệm của máy ảnh sẽ bật trong bất kỳ điều kiện nào sau đây:

  1. Khi được ứng dụng bật bằng cách gọi Session.setCameraTextureNames(ids) với nhiều mã nhận dạng kết cấu.

  2. Khi một hoặc nhiều tính năng ARCore yêu cầu lưu vào bộ đệm nội bộ được bật. Hiện tại, tính năng này bao gồm những tính năng sau:

    • Hình ảnh tăng cường
    • Khuôn mặt tăng cường
  3. Trên một số thiết bị hỗ trợ ARCore, yêu cầu lưu vào bộ đệm nội bộ để hoạt động chính xác.

Xác định xem bạn có bật độ trễ khung hình hay không

Để xác định xem một thiết bị và phiên thực tế tăng cường (AR) nhất định có bật tính năng lưu vào bộ đệm khung (còn gọi là độ trễ khung hình) hay không, hãy sử dụng đầu ra 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.

Bộ nhớ

Mỗi khung máy ảnh bổ sung được lưu vào bộ đệm sẽ làm tăng mức sử dụng bộ nhớ. Ví dụ: một hoạ tiết 1080p sử dụng khoảng 6 MB bộ nhớ (thu được bằng cách nhân độ phân giải 1920 x 1080 với 3 byte dữ liệu RGB trên mỗi pixel).

Xem xét hiệu suất

Việc sử dụng nhiều khung hình của máy ảnh không đảm bảo sẽ giảm sự biến đổi của tốc độ khung hình, cũng như việc sử dụng quy trình kết xuất đa luồng không đảm bảo sẽ mang lại hiệu suất tốt hơn trong mọi trường hợp. Các yếu tố sau ảnh hưởng đến hiệu suất thực tế:

  • Quy trình kết xuất ứng dụng

  • Mô hình phân luồng ứng dụng

  • Cấu trúc CPU của thiết bị

  • Hệ thống lên lịch của hệ điều hành

Nếu ứng dụng không thể tận dụng các khung máy ảnh bổ sung, thì sẽ không có lợi thế về hiệu suất khi sử dụng nhiều hoạ tiết.

Bật tính năng lưu vào bộ đệm

Để hướng dẫn ARCore xem kết cấu nào cần dùng để lưu vào bộ đệm các khung máy ảnh đến, hãy sử dụng Session.setCameraTextureNames(ids) để cung cấp một mảng gồm một hoặc nhiều mã nhận dạng kết cấu. Hàm này chỉ được gọi sau khi tạo phiên và thường chỉ được gọi một lần.

Trong mỗi lệnh gọi đến Session.update(), ARCore sẽ ghi đè kết cấu tiếp theo trong hàng đợi theo trình tự vòng tròn. Nếu ứng dụng của bạn chỉ đặt một mã nhận dạng hoạ tiết duy nhất, thì cùng một hoạ tiết sẽ bị ghi đè mỗi lần.

Sử dụng Frame.getCameraTextureName() để xác định mã nhận dạng hoạ tiết liên kết với khung hiện tại.