Android Проблема с производительностью API Camera2 при предварительном просмотре с помощью setRepeatingRequest - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь профилировать производительность устаревшего проекта, который использует 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 действительно плохо спроектирован с небольшой пользой.

...