使用以下函数将 Android 帧同步与基于 OpenGL ES API 的渲染引擎结合使用。
初始化和销毁
分别使用以下函数来初始化和销毁 Android 帧同步实例:
通常,您应在引擎启动序列中尽早调用 SwappyGL_init(),并在游戏退出时调用 SwappyGL_destroy()。您不应在任何其他时间调用这些方法。
配置交换间隔和刷新周期
使用以下函数配置 Android 帧同步实例:
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 显示界面发生更改并拥有新的 ANativeWindow 句柄时,请调用 SwappyGL_setWindow()(有关示例,请参阅 Bouncyball 示例)。
自动模式
Android 帧同步根据之前帧的平均持续时间调整交换持续时间和流水线模式。您可以使用以下函数控制此行为:
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)。此方法封装了 OpenGL ES 的 eglSwapBuffers() 方法,因此您应将游戏中的所有 eglSwapBuffers() 实例替换为 SwappyGL_swap()。
实用函数
以下方法检查 Android 帧同步是否已启用:
Android 帧同步实例可能因以下任何原因无法初始化:
- 设备上缺少必要的 EGL 函数。
- 系统已设置
swappy.disable属性。
在上述任何一种情况下,SwappyGL_isEnabled() 都会返回 false,此时最好由您实现替代的帧同步策略。