Поделиться через


CameraCaptureSession.Prepare(Surface) Метод

Определение

Предварительно выделите все буферы для выходной поверхности.

[Android.Runtime.Register("prepare", "(Landroid/view/Surface;)V", "GetPrepare_Landroid_view_Surface_Handler", ApiSince=23)]
public abstract void Prepare (Android.Views.Surface surface);
[<Android.Runtime.Register("prepare", "(Landroid/view/Surface;)V", "GetPrepare_Landroid_view_Surface_Handler", ApiSince=23)>]
abstract member Prepare : Android.Views.Surface -> unit

Параметры

surface
Surface

выходная поверхность, для которой должны быть предварительно выделены буферы. Должен быть одним из выходных поверхностей, используемых для создания этого сеанса.

Атрибуты

Комментарии

Предварительно выделите все буферы для выходной поверхности.

Обычно буферы изображений для заданной выходной поверхности выделяются по запросу, чтобы минимизировать задержку запуска и затраты на память.

Однако в некоторых случаях может потребоваться выделить буферы, прежде чем все запросы, предназначенные для Surface, фактически отправляются на устройство. Выделение больших буферов может занять некоторое время, что может привести к задержкам при отправке запросов до тех пор, пока достаточные буферы не будут выделены для достижения поведения устойчивого состояния. Такие задержки могут занять больше времени, чем нужно, или вызвать пропуски или заикания в выходных данных предварительной версии.

Метод prepare() можно использовать для выполнения этого предварительного размещения. Он может вызываться только для заданной выходной поверхности перед тем, как Surface будет использоваться в качестве целевого объекта для запроса. Количество выделенных буферов — это сумма количества, необходимого потребителю, предоставляющего выходную поверхность, и максимальное число, необходимое устройству камеры для заполнения конвейера. Так как это может быть больше, чем то, что на самом деле требуется для устойчивой операции, использование подготовки может привести к более высокому потреблению памяти, чем обычное поведение по запросу. Подготовка() также отложит время до первого вывода в заданный Surface, в обмен на более гладкую частоту кадров после завершения выделения.

Например, приложение, которое создает android.media.ImageReader#newInstance ImageReader аргумент maxImages 10, но одновременно использует только 3 одновременных изображения, как правило, приведет только к выделению этих 3 изображения (а также то, что требуется устройству камеры для плавной работы). Но использование prepare() в ImageReader Surface приведет к выделению всех 10 изображений. Поэтому приложения, использующие этот метод, должны заботиться о том, чтобы запрашивать только количество буферов, необходимых для их приложения.

Если один и тот же выходной Surface используется в последовательных сеансах (без явного закрытия первого сеанса), то его уже выделенные буферы переносятся и если он использовался в качестве целевого объекта запроса на запись в первом сеансе, подготовка не может вызываться во втором сеансе.

После завершения выделения вызовется с помощью Surface, StateCallback#onSurfacePrepared предоставленного этому методу. Между вызовом подготовки и вызовом onSurfacePrepared surface, предоставленным для подготовки, не следует использовать в качестве целевого объекта CaptureRequest, отправленного в этот сеанс.

Обратите внимание, что если 2 поверхности совместно используют один и тот же поток через OutputConfiguration#enableSurfaceSharing и OutputConfiguration#addSurface, подготовка() необходимо вызывать только на одной поверхности и StateCallback#onSurfacePrepared будет активирована для обеих поверхностей.

android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY устройства не могут заранее выделить выходные буферы; для этих устройств StateCallback#onSurfacePrepared будет немедленно вызван и не будет выполнено предварительное размещение.

Документация по Java для android.hardware.camera2.CameraCaptureSession.prepare(android.view.Surface).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к