diff --git a/src/engine/platform/platform.h b/src/engine/platform/platform.h index 8cda5df..fe48ab8 100644 --- a/src/engine/platform/platform.h +++ b/src/engine/platform/platform.h @@ -14,6 +14,7 @@ struct android_app; struct AInputEvent; +struct ANativeWindow; #elif defined(__linux__) @@ -96,6 +97,21 @@ class Platform { static int32_t HandleInput(android_app* app, AInputEvent* event); static void HandleCmd(android_app* app, int32_t cmd); + using PFN_ANativeWindow_setFrameRate = int32_t (*)(ANativeWindow* window, + float frameRate, + int8_t compatibility); + using PFN_ANativeWindow_setFrameRateWithChangeStrategy = + int32_t (*)(ANativeWindow* window, + float frameRate, + int8_t compatibility, + int8_t changeFrameRateStrategy); + + PFN_ANativeWindow_setFrameRate ANativeWindow_setFrameRate = nullptr; + PFN_ANativeWindow_setFrameRateWithChangeStrategy + ANativeWindow_setFrameRateWithChangeStrategy = nullptr; + + void SetFrameRate(float frame_rate); + #elif defined(__linux__) Display* display_ = nullptr; diff --git a/src/engine/platform/platform_android.cc b/src/engine/platform/platform_android.cc index 79fc4fc..89e174f 100644 --- a/src/engine/platform/platform_android.cc +++ b/src/engine/platform/platform_android.cc @@ -1,6 +1,7 @@ #include "engine/platform/platform.h" #include +#include #include #include @@ -24,7 +25,6 @@ Java_com_kaliber_base_KaliberActivity_onShowAdResult(JNIEnv* env, jboolean succeeded) { g_showing_interstitial_ad = !!succeeded; } - } std::string GetApkPath(ANativeActivity* activity) { @@ -294,6 +294,7 @@ void Platform::HandleCmd(android_app* app, int32_t cmd) { case APP_CMD_INIT_WINDOW: DLOG << "APP_CMD_INIT_WINDOW"; if (app->window != NULL) { + platform->SetFrameRate(60); if (!platform->renderer_->Initialize(app->window)) { LOG << "Failed to initialize the renderer."; throw internal_error; @@ -371,6 +372,18 @@ void Platform::Initialize(android_app* app) { app->onAppCmd = Platform::HandleCmd; app->onInputEvent = Platform::HandleInput; + // Get pointers for functions that are supported from API > minSdk if + // available. + void* mLibAndroid = dlopen("libandroid.so", RTLD_NOW | RTLD_LOCAL); + if (mLibAndroid) { + ANativeWindow_setFrameRate = + reinterpret_cast( + dlsym(mLibAndroid, "ANativeWindow_setFrameRate")); + ANativeWindow_setFrameRateWithChangeStrategy = + reinterpret_cast( + dlsym(mLibAndroid, "ANativeWindow_setFrameRateWithChangeStrategy")); + } + Update(); } @@ -417,6 +430,17 @@ void Platform::SetKeepScreenOn(bool keep_screen_on) { ::SetKeepScreenOn(app_->activity, keep_screen_on); } +void Platform::SetFrameRate(float frame_rate) { + if (ANativeWindow_setFrameRateWithChangeStrategy) { + ANativeWindow_setFrameRateWithChangeStrategy( + app_->window, frame_rate, + ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT, 1); + } else if (ANativeWindow_setFrameRate) { + ANativeWindow_setFrameRate(app_->window, frame_rate, + ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT); + } +} + } // namespace eng void android_main(android_app* app) {