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.
- Adiciona carimbos de data/hora da apresentação para que os frames sejam apresentados no prazo, não cedo.
- Usa as extensões de carimbo de data/hora da apresentação
EGL_ANDROID_presentation_time
eVK_GOOGLE_display_timing
.
- 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
eVkFence
).
- 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
- Integrar a Android Frame Pacing ao renderizador OpenGL
- Integrar o Android Frame Pacing ao renderizador Vulkan
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:
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.