借助以下函数将 Android Frame Pacing 与基于 OpenGL ES API 的渲染引擎结合使用。
初始化和销毁
使用以下函数分别初始化和销毁 Android Frame Pacing 的实例:
一般而言,应在引擎启动序列期间尽早调用 SwappyGL_init()
,并且应在游戏退出时调用 SwappyGL_destroy()
。在其他任何时间,均无需调用这些方法。
配置交换间隔和刷新周期
使用以下函数配置 Android Frame Pacing 的实例:
void SwappyGL_setSwapIntervalNS(uint64_t swap_ns);
void SwappyGL_setFenceTimeoutNS(uint64_t fence_timeout_ns);
void SwappyGL_setUseAffinity(bool tf);
调用 SwappyGL_setSwapIntervalNS()
时,传入帧应呈现的时长。在大多数情况下,您可以使用以下常量之一:SWAPPY_SWAP_60FPS
、SWAPPY_SWAP_30FPS
或 SWAPPY_SWAP_20FPS
。
一般而言,您应在调用 SwappyGL_init()
后直接调用这些方法。但是,您可能还需要在游戏执行的其他时间调用这些方法。
设置 ANativeWindow
Swappy 需要 ANativeWindow
的句柄才能执行特定于 ANativeWindow
的操作,例如调用 ANativeWindow_setFrameRate()
。如果您的 Android 显示 Surface 发生变化,并且您有新的 ANativeWindow
句柄,请调用 SwappyGL_setWindow()
(请参阅 Bouncyball 示例)。
自动模式
Android Frame Pacing 会基于先前帧的平均时长调整交换时长和流水线模式。您可以使用以下函数控制此行为:
void SwappyGL_setAutoSwapInterval(bool enabled);
void SwappyGL_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyGL_setAutoPipelineMode(bool enabled);
执行每帧交换
在每个渲染帧中,调用 bool SwappyGL_swap(EGLDisplay display, EGLSurface surface)
。此方法封装了来自 Open GL ES 的 eglSwapBuffers()
方法,因此您应该将游戏中的所有 eglSwapBuffers()
实例替换为 SwappyGL_swap()
。
实用函数
以下方法可检查是否已启用 Android Frame Pacing:
Android Frame Pacing 的实例可能由于以下任一原因而无法自行初始化:
- 设备缺少必要的 EGL 函数。
- 系统已设置
swappy.disable
属性。
在上述任一情况下,SwappyGL_isEnabled()
都会返回 false
,您最好实施一个其他帧同步策略。