O Mir 2 usa o Swappy para melhorar o desempenho da renderização

Mir 2: Return of the King é um jogo para dispositivos móveis de alta qualidade da Legend IP autorizado pela Actoz Soft e desenvolvido pela HK ZHILI YAOAN LIMITED usando o Unity Engine.

O jogo recria perfeitamente os sentimentos de "Mir 2", um MMORPG de fantasia coreano, e também oferece muitos dos conteúdos mais populares, como a coleção de equipamentos, o ataque de areia em grande escala e outras jogabilidades principais.

O jogo usou a API Android Frame Pacing (Swappy) para melhorar a estabilidade do frame rate, ter uma renderização suave e aumentar significativamente os Android vitals (métrica de sessão lenta).

A sessão lenta foi lançada no Android vitals

Sessão lenta é uma métrica do Android vitals no Google Play Console. Uma sessão lenta tem mais de 25% de frames lentos. Um frame é considerado lento quando:

1) A 20qps, ele não é apresentado em 50 ms após o frame anterior. 2) A 30 fps, ele não é apresentado em 34 ms após o frame anterior.

No futuro, o Google Play vai direcionar os usuários a outras opções quando os jogos não alcançarem 20 QPS no smartphone.

Há muitos motivos para um frame aparecer ou renderizar por mais tempo na tela do que a meta do desenvolvedor. O jogo pode estar limitado à CPU ou à GPU, superaquecendo, ativando um estado térmico limitado ou havendo uma incompatibilidade na taxa de frames do jogo e na taxa de atualização da tela do dispositivo.

O que é o Swappy

A biblioteca Android Frame Pacing, também conhecida como Swappy, faz parte das bibliotecas do AGDK. O Swappy ajuda os jogos OpenGL e Vulkan a renderizar e corrigir o ritmo de frames no Android.

A biblioteca processa várias taxas de atualização, se compatíveis com o dispositivo, o que oferece ao jogo mais flexibilidade para apresentar um frame. Por exemplo, para um dispositivo que é compatível com uma taxa de atualização de 60 Hz e 90 Hz, um jogo que não pode produzir 60 frames por segundo pode diminuir para 45 FPS em vez de 30 FPS para continuar funcionando de maneira uniforme. A biblioteca detecta o frame rate esperado do jogo e ajusta automaticamente os tempos de apresentação de frame.

A biblioteca Frame Pacing também melhora a duração da bateria porque evita atualizações desnecessárias da tela. Por exemplo, se um jogo for renderizado a 60 QPS, mas a tela for atualizada a 120 Hz, a tela será atualizada duas vezes para cada frame. A biblioteca Frame Pacing evita isso definindo a taxa de atualização como o valor compatível com o dispositivo mais próximo do frame rate desejado.

Como o Mir 2 melhorou o desempenho da renderização com o Swappy

O Mir 2 (미르2: 왕의 귀환) estava enfrentando um problema com a performance de renderização instável, em que 40% das sessões eram lentas com um limite de taxa de frames de 20 QPS, muito maior do que o limite de 20% do Google Play.

Figura 1. Métrica de sessão lenta antes da integração do Swappy.

Mir 2 (미르2: 왕의 귀환) é um jogo com gráficos de alta fidelidade. Alguns dispositivos estão enfrentando desafios para manter um QPS estável. A distribuição de taxa de frames mostra que muitas sessões estão sendo executadas com QPS menor que 20.

Figura 2. A distribuição de QPS do jogo antes da integração do Swappy.
Cada bucket representa a porcentagem de sessões em que 75% dos frames foram mais rápidos do que o rótulo do bucket.

Quando a carga de trabalho de exibição demora mais que a carga de trabalho do aplicativo, frames adicionais são adicionados a uma fila. Isso causa, mais uma vez, renderização lenta e pode levar a um frame extra de latência devido ao buffer-stuffing.

Figura 3. O frame longo B causa um ritmo incorreto para dois frames: A e B.

A biblioteca Swappy resolve isso usando limites de sincronização (EGL_KHR_fence_sync e VkFence) para injetar esperas no aplicativo que permitem que o pipeline de exibição seja atualizado, em vez de permitir que a pressão de retorno se acumule. O frame A ainda apresenta um frame extra, mas o frame B agora é apresentado corretamente.

Figura 4. Os frames C e D aguardam a apresentação.

O Mir 2 integrou facilmente a biblioteca Swappy usando o recurso Optimized Frame Pacing integrado do Unity. A ação resultou em uma melhoria significativa no desempenho de renderização, especificamente reduzindo a métrica de sessões lentas de 40% para 10%.

Figura 5. Melhoria lenta da sessão após a integração do Swappy.

O número de sessões lentas foi reduzido significativamente para Mir2 depois que a Swappy foi integrada.

Figura 6. A distribuição de QPS do jogo após a integração do Swappy.
Cada bucket representa a porcentagem de sessões em que 75% dos frames foram mais rápidos do que o rótulo do bucket.

Começar a usar o Swappy

Como usar o Swappy em mecanismos de jogo nativos

Consulte os guias a seguir para integrar a biblioteca Android Frame Pacing ao jogo:

Como usar o Swappy no mecanismo de jogo do Unity

O Unity integrou o Android Frame Pacing ao mecanismo. Para ativar esse recurso no Unity, marque a caixa de seleção Optimized Frame Pacing em Project Settings > Player > Settings for Android > Resolution and Presentation:

Figura 7. Ative o Frame Pacing no Unity Engine.

Como alternativa, ative programaticamente a opção de frame pacing otimizado no código lógico para permitir que o Unity distribua frames de maneira uniforme e tenha menos variação no frame rate, criando uma jogabilidade mais suave.

Como usar o Swappy no mecanismo de jogo Unreal

O Unreal 4.25 e versões mais recentes integram a Biblioteca Android Frame Pacing, que faz parte do Android Game Development Kit. O artigo Ritmo de frames para dispositivos móveis explica como ativar a Biblioteca Android Frame Pacing e como controlar o ritmo de frames pelo código C++.

Para saber mais, leia sobre Sessões lentas e Swappy.