В общем случае следует вызывать SwappyGL_init() как можно раньше во время запуска движка, а SwappyGL_destroy() — при выходе из игры. В других случаях вызывать эти методы не требуется.
Настройте интервал подкачки и период обновления
Используйте следующие функции для настройки экземпляра Android Frame Pacing:
При вызове SwappyGL_setSwapIntervalNS() передайте длительность показа кадра. В большинстве случаев можно использовать одну из следующих констант: SWAPPY_SWAP_60FPS , SWAPPY_SWAP_30FPS или SWAPPY_SWAP_20FPS .
Как правило, эти методы следует вызывать сразу после вызова SwappyGL_init() . Однако может возникнуть необходимость вызывать эти методы и в других моментах выполнения игры.
Настройка ANativeWindow
Swappy необходим дескриптор ANativeWindow для выполнения специфичной для ANativeWindow операции, например, вызова ANativeWindow_setFrameRate() . Вызывайте SwappyGL_setWindow() , когда поверхность дисплея Android изменилась и у вас появился новый дескриптор ANativeWindow (см. пример Bouncyball ).
Автоматические режимы
Функция Android Frame Pacing регулирует длительность подкачки и режим конвейера на основе средней длительности предыдущих кадров. Вы можете управлять этим поведением с помощью следующих функций:
Во время каждого кадра рендеринга вызывайте bool SwappyGL_swap(EGLDisplay display, EGLSurface surface) . Этот метод является обёрткой для метода eglSwapBuffers() из Open GL ES, поэтому вам следует заменить все экземпляры eglSwapBuffers() в вашей игре на SwappyGL_swap() .
Функции полезности
Следующий метод проверяет, включен ли Android Frame Pacing:
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-08-26 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2025-08-26 UTC."],[],[],null,["Use the following functions to use Android Frame Pacing with a rendering engine\nbased on the OpenGL ES API.\n\nInitialize and destroy\n\nUse the following functions to initialize and destroy an instance of Android\nFrame Pacing, respectively:\n\n- [`void SwappyGL_init(JNIEnv *env, jobject jactivity);`](/games/sdk/reference/frame-pacing/group/swappy-g-l#group__swappy_g_l_1gad9a8392c399ae9b87a7bfe3f14678019)\n- [`void SwappyGL_destroy();`](/games/sdk/reference/frame-pacing/group/swappy-g-l#group__swappy_g_l_1gaa8c4eac2519c1c0bede3e54d848ecd4c)\n\nIn general, you should call `SwappyGL_init()` as early as possible during the\nengine startup sequence, and you should call `SwappyGL_destroy()` when the game\nis exiting. You shouldn't need to call these methods at any other time.\n\nConfigure swap interval and refresh period\n\nUse the following functions to configure an instance of Android Frame Pacing:\n\n- [`void SwappyGL_setSwapIntervalNS(uint64_t swap_ns);`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_setswapintervalns)\n- [`void SwappyGL_setFenceTimeoutNS(uint64_t fence_timeout_ns);`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_setfencetimeoutns)\n- [`void SwappyGL_setUseAffinity(bool tf);`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_setuseaffinity)\n\n| **Note:** Basic integrations usually don't require you to call `SwappyGL_setFenceTimeoutNS()` and `SwappyGL_setUseAffinity()`.\n\nWhen calling `SwappyGL_setSwapIntervalNS()`, pass in the duration that a frame\nshould be presented. In most cases, you can use one of the following constants:\n`SWAPPY_SWAP_60FPS`, `SWAPPY_SWAP_30FPS`, or `SWAPPY_SWAP_20FPS`.\n\nIn general, you should call these methods directly after a call to\n`SwappyGL_init()`. However, you might also need to call these methods at other\ntimes during your game's execution.\n\nSetting the ANativeWindow\n\nSwappy needs the handle of `ANativeWindow` in order to perform\n`ANativeWindow`-specific operation, such as calling\n[`ANativeWindow_setFrameRate()`](/ndk/reference/group/a-native-window#anativewindow_setframerate).\nCall\n[`SwappyGL_setWindow()`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_setwindow)\nwhen your Android display surface has changed and you have a new `ANativeWindow`\nhandle (see the [Bouncyball sample](https://android.googlesource.com/platform/frameworks/opt/gamesdk/+/refs/heads/master/samples/bouncyball) for an example).\n\nAuto Modes\n\nAndroid Frame Pacing adjusts the swap duration and pipeline mode based on the\naverage duration of previous frames. You can control this behavior with the\nfollowing functions:\n\n- [`void SwappyGL_setAutoSwapInterval(bool enabled);`](/games/sdk/reference/frame-pacing/group/swappy-g-l-extra#swappygl_setautoswapinterval)\n- [`void SwappyGL_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);`](/games/sdk/reference/frame-pacing/group/swappy-g-l-extra#swappygl_setmaxautoswapintervalns)\n- [`void SwappyGL_setAutoPipelineMode(bool enabled);`](/games/sdk/reference/frame-pacing/group/swappy-g-l-extra#swappygl_setautopipelinemode)\n\nPerform per-frame swap\n\nDuring each rendering frame, call\n[`bool SwappyGL_swap(EGLDisplay display, EGLSurface surface)`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_swap).\nThis method wraps the `eglSwapBuffers()` method from Open GL ES, so you should\nreplace all instances of `eglSwapBuffers()` in your game with `SwappyGL_swap()`.\n\nUtility functions\n\nThe following method checks whether Android Frame Pacing is enabled:\n\n- [`bool SwappyGL_isEnabled();`](/games/sdk/reference/frame-pacing/group/swappy-g-l#swappygl_isenabled)\n\nIt's possible that an instance of Android Frame Pacing isn't able to initialize\nitself for any of the following reasons:\n\n- The necessary EGL functions are missing on the device.\n- The system has set the `swappy.disable` property.\n\nIn either of these situations, `SwappyGL_isEnabled()` returns `false`, and it's\nbest for you to implement an alternative frame-pacing strategy.\n| **Note:** Even if `SwappyGL_isEnabled()` returns `false`, the `SwappyGL_swap()` function still invokes `eglSwapBuffers()`."]]