From 5297f563a4dd6a9d25c7f45714d54d45897f3bb0 Mon Sep 17 00:00:00 2001 From: Kiyong Jung Date: Thu, 16 Aug 2018 19:32:20 +0900 Subject: [android] Make AndroidRendererFrontend to request render once per event loop (#12586) When AndroidRendererFrontend::update() called multiple times in a single loop, updateAsyncTask->send() will perform nothing, thus MapRenderer::update()/requestRender() will be coalesced. --- .../testapp/activity/style/RuntimeStyleActivity.java | 13 +++++++++++++ .../src/main/res/menu/menu_runtime_style.xml | 4 ++++ .../src/main/res/values/actions.xml | 1 + platform/android/src/android_renderer_frontend.cpp | 11 ++++++++--- platform/android/src/android_renderer_frontend.hpp | 8 ++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java index f49d80d704..20fa2e7d52 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/RuntimeStyleActivity.java @@ -197,6 +197,9 @@ public class RuntimeStyleActivity extends AppCompatActivity { case R.id.action_numeric_filter: styleNumericFillLayer(); return true; + case R.id.action_bring_water_to_front: + bringWaterToFront(); + return true; default: return super.onOptionsItemSelected(item); } @@ -572,6 +575,16 @@ public class RuntimeStyleActivity extends AppCompatActivity { }, 2000); } + private void bringWaterToFront() { + Layer water = mapboxMap.getLayer("water"); + if (water != null) { + mapboxMap.removeLayer(water); + mapboxMap.addLayerAt(water, mapboxMap.getLayers().size() - 1); + } else { + Toast.makeText(this, "No water layer in this style", Toast.LENGTH_SHORT).show(); + } + } + private static class DefaultCallback implements MapboxMap.CancelableCallback { @Override diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml index 5c77179272..e3d7c8cfa0 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_runtime_style.xml @@ -66,4 +66,8 @@ android:id="@+id/action_numeric_filter" android:title="@string/apply_numeric_fill_filter" mapbox:showAsAction="never" /> + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml index 6d94c03529..e3cdc06dc1 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml @@ -79,6 +79,7 @@ Apply filtered fill Apply filtered line Apply numeric fill filter + Bring water to front Toggle text size Toggle text field contents Toggle text font diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 2a03d9de9e..8b4a25a4d9 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -56,7 +57,11 @@ private: AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) : mapRenderer(mapRenderer_) - , mapRunLoop(util::RunLoop::Get()) { + , mapRunLoop(util::RunLoop::Get()) + , updateAsyncTask(std::make_unique([this]() { + mapRenderer.update(std::move(updateParams)); + mapRenderer.requestRender(); + })) { } AndroidRendererFrontend::~AndroidRendererFrontend() = default; @@ -73,8 +78,8 @@ void AndroidRendererFrontend::setObserver(RendererObserver& observer) { } void AndroidRendererFrontend::update(std::shared_ptr params) { - mapRenderer.update(std::move(params)); - mapRenderer.requestRender(); + updateParams = std::move(params); + updateAsyncTask->send(); } void AndroidRendererFrontend::reduceMemoryUse() { diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index b61904e388..9bd64e4819 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -18,6 +18,12 @@ namespace mbgl { class RenderedQueryOptions; class SourceQueryOptions; +namespace util { + +class AsyncTask; + +} // namespace util + namespace android { class AndroidRendererFrontend : public RendererFrontend { @@ -44,6 +50,8 @@ public: private: MapRenderer& mapRenderer; util::RunLoop* mapRunLoop; + std::unique_ptr updateAsyncTask; + std::shared_ptr updateParams; }; } // namespace android -- cgit v1.2.1