Я пытаюсь профилировать производительность устаревшего проекта, который использует API Google Camera2 для реализации функции предварительного просмотра и захвата неподвижных изображений. Я обнаружил, что процесс предварительного просмотра занимает слишком много ресурсов (возможно, отправлено слишком много CaptureRequest ?). Функция предварительного просмотра была реализована в SurfaceView
. Захват неподвижного изображения с установленным предварительным просмотром, обратные вызовы захвата неподвижного изображения могут быть вызваны с задержкой от 500 до 700 мс между session.capture
и обратным вызовом onCaptureStarted
. С помощью инструмента systrace я обнаружил, что waitForNextRequestBatch
на самом деле занимает очень много времени. Это означает, что предыдущие запросы предварительного просмотра, отправленные от setRepeatingRequest
, все еще обрабатываются. Так что конвейер данных камеры был заблокирован. Еще одно свидетельство: если я отключу предварительный просмотр с помощью функции setRepeatingRequest
комментария CameraCaptureSession
, тогда время задержки обратных вызовов неподвижного захвата будет значительно сокращено.
Мой вопрос заключается в том, что проблема с производительностью предварительного просмотра вызвана какая-то особая конфигурация его запроса или это была проблема API / оборудования? Мое устройство для отладки - Mi9, и я уверен, что оно полностью поддерживает Camera2 API.
Одно из возможных решений - каждый раз звонить captureSession.abortCaptures
перед тем, как еще session.capture
. Однако официальная документация не рекомендует удалять ожидающие запросы с помощью этого метода, даже если они сделали то же самое в своей официальной демонстрации .
Более того, я вижу исключение времени выполнения следующим образом, когда используя abortCaptures:
Caught a RuntimeException from the binder stub implementation.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.camera2.CaptureRequest android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallbackHolder.getRequest(int)' on a null object reference
at android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks.onCaptureErrorLocked(CameraDeviceImpl.java:2404)
at android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks.onDeviceError(CameraDeviceImpl.java:2046)
at android.hardware.camera2.ICameraDeviceCallbacks$Stub.onTransact(ICameraDeviceCallbacks.java:137)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
Мне действительно нужно позвонить abortCaptures
, чтобы отменить запрос из предварительного просмотра? Или, может быть, есть другой способ избежать проблем с производительностью? Любая помощь будет признательна. Поскольку структура оригинала очень тяжелая и беспорядочная, и у меня раньше не было опыта разработки Android, информация, которую я предоставил выше, может быть недостаточной или неточной. Между прочим, с моей точки зрения без особого опыта разработки Android, API Google Camera2 действительно плохо спроектирован с небольшой пользой.