Adicionar funções de ritmo de frame

Use as funções abaixo para usar a biblioteca Android Frame Pacing com um mecanismo de renderização baseado na API OpenGL ES.

Inicializar e destruir

Use as funções abaixo para inicializar e destruir uma instância da Android Frame Pacing, respectivamente:

Em geral, chame SwappyGL_init() o quanto antes durante a sequência de inicialização do mecanismo e chame SwappyGL_destroy() quando o jogo for encerrado. Não é necessário chamar esses métodos em nenhum outro momento.

Configurar intervalo de troca e período de atualização

Use as funções abaixo para configurar uma instância da Android Frame Pacing:

Ao chamar SwappyGL_setSwapIntervalNS(), transmita a duração da apresentação do frame. Na maioria dos casos, é possível usar uma das seguintes constantes: SWAPPY_SWAP_60FPS, SWAPPY_SWAP_30FPS ou SWAPPY_SWAP_20FPS.

Em geral, chame esses métodos diretamente após uma chamada para SwappyGL_init(). No entanto, pode ser necessário chamar esses métodos em outros momentos durante a execução do jogo.

Como configurar ANativeWindow

O Swappy precisa do handle de ANativeWindow para executar uma operação específica de ANativeWindow, como chamar ANativeWindow_setFrameRate(). Chame SwappyGL_setWindow() quando a superfície de exibição do Android mudar e você tiver um novo identificador ANativeWindow. Consulte o exemplo do Bouncyball para um exemplo.

Modos automáticos

A Android Frame Pacing ajusta a duração da troca e o modo do pipeline com base na duração média dos frames anteriores. É possível controlar esse comportamento com as seguintes funções:

Realizar troca por frame

Durante cada frame de renderização, chame bool SwappyGL_swap(EGLDisplay display, EGLSurface surface). Esse método envolve o método eglSwapBuffers() do Open GL ES, portanto, é necessário substituir todas as instâncias de eglSwapBuffers() no jogo por SwappyGL_swap().

Funções utilitárias

O método abaixo verifica se a Android Frame Pacing está ativada:

É possível que uma instância da Android Frame Pacing não consiga ser inicializada por um destes motivos:

  • As funções EGL necessárias estão ausentes no dispositivo.
  • O sistema definiu a propriedade swappy.disable.

Em qualquer uma dessas situações, SwappyGL_isEnabled() retorna false, e é melhor implementar uma estratégia de ritmo de frame alternativo.