OpenGL ES API に基づくレンダリング エンジンで Android Frame Pacing を使用するには、下記の関数を使用します。
初期化と破棄
次の関数を使用して、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_setFrameRate()
の呼び出しなどの ANativeWindow
固有のオペレーションを実行するために ANativeWindow
のハンドルが必要です。Android ディスプレイ サーフェスが変更され、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
を返すため、別のフレーム ペーシング方法を実装することをおすすめします。