Frame Pacing

A biblioteca Android Frame Pacing, também conhecida como Swappy, faz parte do SDK para jogos do Android. Ela ajuda os jogos OpenGL e Vulkan a ter uma renderização uniforme e o ritmo de frames correto no Android.

que é a sincronização da lógica e do loop de renderização de um jogo subsistema de exibição de um SO e o hardware de exibição subjacente. A tela do Android subsistema foi projetado para evitar certos artefatos visuais, como rasgos. O subsistema de exibição evita a ruptura fazendo o seguinte:

  • Como armazenar frames anteriores em buffer internamente
  • Como detectar envios de frames atrasados
  • Exibição do frame atual quando um frame atrasado é detectado

Tempos de exibição de frame inconsistentes são causados pelo loop de renderização de um jogo em execução em uma taxa diferente da que o hardware de tela nativa suporta. Problemas surgem quando o loop de renderização de um jogo é executado muito lentamente para o hardware de tela subjacente; resultando em tempos de exibição inconsistentes. Por exemplo, quando um jogo executado 30 QPS tenta renderizar em um dispositivo com suporte nativo a 60 QPS, o loop de renderização do jogo faz com que um frame repetido permaneça na tela por um 16 ms extras. Esse tipo de desconexão cria inconsistências substanciais nos tempos para a renderização de frames como 33 ms, 16 ms, 49 ms e assim por diante. Cenas muito complexas ainda são mais compostas esse problema porque causam a perda de frames.

A biblioteca Frame Pacing executa estas tarefas:

  • Compensa a renderização lenta devido a frames curtos.
  • Usa limites de sincronização para frames longos que causam renderização lenta e latência.
    • Injeta esperas no app. Isso permite que o pipeline de exibição capture em vez de permitir o acúmulo de pressão.
    • Usa limites de sincronização (EGL_KHR_fence_sync e VkFence).
  • Escolhe uma taxa de atualização para oferecer flexibilidade e uma apresentação suave, caso seu dispositivo seja compatível com várias taxas de atualização.
  • Fornece estatísticas para depuração e criação de perfil usando frames estatísticas.

Para aprender a configurar a biblioteca para operar em modos diferentes de acordo com para o que precisa, consulte Modos de operação compatíveis.

Para implementar usando o renderizador OpenGL ou Vulkan, consulte

Para ler mais, consulte Garantir um ritmo adequado de frames.

Intervenção de limitação de quadros por segundo

A intervenção de limitação de quadros por segundo (QPS) permite que os jogos tenham um ritmo adequado de QPS usando apenas o lado da plataforma e sem exigir nenhuma ação por parte do desenvolvedor parte.

A implementação da intervenção de limitação de QPS usa os seguintes componentes:

Serviço GameManager

O O componente GameManagerService mantém todas as permissões informações por jogo sobre o modo e a intervenção do jogo. As informações de QPS são armazenadas GameManagerService com outras informações de intervenção, como o fator de redução da resolução, em um mapeamento <PACKAGE_NAME, Interventions> para cada perfil de usuário. As informações de QPS são acessadas quando o modo de jogo é alterado ou a intervenção é atualizada. Um O UID é exclusivo para cada PACKAGE_NAME e usuário e pode ser traduzido em um par <UID, Frame Rate> para enviar ao SurfaceFlinger.

SurfaceFlinger

O componente SurfaceFlinger já é compatível limitar o QPS de um aplicativo, desde que o frame rate seja um divisor da taxa de atualização da tela. No caso de uma vsync, o SurfaceFlinger verifica a validade da vsync para aplicativo verificando se o carimbo de data/hora da vsync está em fase com o frame rate do para o aplicativo. Se o frame rate não estiver em fase com o vsync, o SurfaceFlinger vai conter a até que o frame rate e a vsync estejam em fase.

A figura a seguir descreve a interação entre o GameManagerService e o SurfaceFlinger:

Interação entre o GameManagerService e o SurfaceFlinger

Figura 1. Interação entre GameServiceManager e SurfaceFlinger

O SurfaceFinger mantém um mapeamento de par <UID, Frame Rate> para definir um novo prioridade de limitação do frame rate. O UID é exclusivo entre usuários e jogos, de modo que cada usuários em um único dispositivo podem ter diferentes configurações de frame rate para o mesmo jogo. Para limitar o de um jogo, o GameServiceManager chama o SurfaceFlinger para substituir o frame rate para um UID. Com esse mecanismo, o SurfaceFlinger atualiza o mapeamento sempre que o modo de jogo é alterado ou a intervenção é atualizada. O SurfaceFlinger lida com a mudança de QPS travando os buffers adequadamente.

Para entender mais sobre a limitação de QPS, consulte Introdução à limitação de QPS.