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:
void SwappyGL_setSwapIntervalNS(uint64_t swap_ns);
void SwappyGL_setFenceTimeoutNS(uint64_t fence_timeout_ns);
void SwappyGL_setUseAffinity(bool tf);
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:
void SwappyGL_setAutoSwapInterval(bool enabled);
void SwappyGL_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyGL_setAutoPipelineMode(bool enabled);
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.