Partilhar via


CameraCaptureSession.Prepare(Surface) Método

Definição

Pré-aloque todos os buffers para um Surface de saída.

[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

Parâmetros

surface
Surface

o Surface de saída para o qual os buffers devem ser pré-alocados. Deve ser uma das Superfícies de saída usadas para criar esta sessão.

Atributos

Comentários

Pré-aloque todos os buffers para um Surface de saída.

Normalmente, os buffers de imagem para um determinado Surface de saída são alocados sob demanda, para minimizar a latência de inicialização e a sobrecarga de memória.

No entanto, em alguns casos, pode ser desejável que os buffers sejam alocados antes que quaisquer solicitações direcionadas ao Surface sejam realmente enviadas ao dispositivo. Buffers grandes podem levar algum tempo para alocar, o que pode resultar em atrasos no envio de solicitações até que buffers suficientes sejam alocados para atingir o comportamento de estado estacionário. Esses atrasos podem fazer com que as rajadas demorem mais do que o desejado ou causar saltos ou gaguejos na saída de visualização.

O método prepare() pode ser usado para executar essa pré-alocação. Só pode ser chamado para um determinado Surface de saída antes de esse Surface ser utilizado como destino para um pedido. O número de buffers alocados é a soma da contagem necessária para o consumidor que fornece o Surface de saída e o número máximo necessário para o dispositivo da câmera preencher seu pipeline. Como esse pode ser um número maior do que o realmente necessário para a operação de estado estacionário, o uso de preparação pode resultar em um consumo de memória maior do que o comportamento normal sob demanda. Prepare() também atrasará o tempo para a primeira saída para um determinado Surface, em troca de uma taxa de quadros mais suave quando a alocação for concluída.

Por exemplo, um aplicativo que cria um android.media.ImageReader#newInstance ImageReader com um argumento maxImages de 10, mas usa apenas 3 imagens simultâneas ao mesmo tempo, normalmente só faria com que essas 3 imagens fossem alocadas (mais o que é necessário para o dispositivo da câmera para uma operação suave). Mas o uso de prepare() no ImageReader Surface resultará na alocação de todas as 10 imagens. Portanto, os aplicativos que usam esse método devem ter o cuidado de solicitar apenas o número de buffers realmente necessários para sua aplicação.

Se o mesmo Surface de saída for usado em sessões consecutivas (sem fechar a primeira sessão explicitamente), seus buffers já alocados serão transferidos e, se ele foi usado como destino de uma solicitação de captura na primeira sessão, a preparação não poderá ser chamada na segunda sessão.

Quando a alocação estiver concluída, StateCallback#onSurfacePrepared será invocada com o Surface fornecido a este método. Entre a chamada de preparação e a chamada onSurfacePrepared, o Surface fornecido para preparar não deve ser usado como destino de um CaptureRequest enviado para esta sessão.

Observe que se 2 superfícies compartilham o mesmo fluxo via OutputConfiguration#enableSurfaceSharing e OutputConfiguration#addSurface, prepare() só precisa ser chamado em uma superfície, e StateCallback#onSurfacePrepared será acionado para ambas as superfícies.

android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY os dispositivos não podem pré-alocar buffers de saída; para esses dispositivos, StateCallback#onSurfacePrepared será imediatamente chamado, e nenhuma pré-alocação é feita.

Documentação Java para android.hardware.camera2.CameraCaptureSession.prepare(android.view.Surface).

Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.

Aplica-se a