From 3512da96093916b09d925d9a64957011de6af8dc Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Thu, 23 Jul 2015 17:43:01 +0300 Subject: [PATCH] Avoid nudging transitions if a gesture is in progress We're now using nudgeTransitions() to tell the Map view that we want to update it. However, if we're on a gesture movement, the update() call can get called too fast and causing general slowdown. This check ensures we only call for nudgeTransitions() after all gesture events are finished. Fixes the issue pointed out by #1548 on Android. --- android/cpp/jni.cpp | 6 +++--- android/cpp/native_map_view.cpp | 7 +++++-- .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 3 ++- .../main/java/com/mapbox/mapboxgl/views/NativeMapView.java | 6 +++--- include/mbgl/android/native_map_view.hpp | 2 +- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 7b585f220..2f58b1722 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -378,11 +378,11 @@ void JNICALL nativeUpdate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) { nativeMapView->getMap().update(); } -void JNICALL nativeOnInvalidate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) { +void JNICALL nativeOnInvalidate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jboolean inProgress) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeOnInvalidate"); assert(nativeMapViewPtr != 0); NativeMapView *nativeMapView = reinterpret_cast(nativeMapViewPtr); - nativeMapView->onInvalidate(); + nativeMapView->onInvalidate(inProgress); } void JNICALL nativeViewResize(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jint width, jint height) { @@ -1428,7 +1428,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { {"nativePause", "(J)V", reinterpret_cast(&nativePause)}, {"nativeResume", "(J)V", reinterpret_cast(&nativeResume)}, {"nativeUpdate", "(J)V", reinterpret_cast(&nativeUpdate)}, - {"nativeOnInvalidate", "(J)V", reinterpret_cast(&nativeOnInvalidate)}, + {"nativeOnInvalidate", "(JZ)V", reinterpret_cast(&nativeOnInvalidate)}, {"nativeViewResize", "(JII)V", reinterpret_cast(static_cast(&nativeViewResize))}, diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index ebdc7f7f6..9c7a3efde 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -758,12 +758,15 @@ void NativeMapView::updateFps() { env = nullptr; } -void NativeMapView::onInvalidate() { +void NativeMapView::onInvalidate(bool inProgress) { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::onInvalidate()"); const bool dirty = !clean.test_and_set(); if (dirty) { - map.renderSync(); + const bool needsRerender = map.renderSync(); + if (!inProgress) { + map.nudgeTransitions(needsRerender); + } } } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 17ace8741..2357c557e 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -1268,7 +1268,8 @@ public class MapView extends SurfaceView { post(new Runnable() { @Override public void run() { - mNativeMapView.invalidate(); + boolean inProgress = mRotateGestureDetector.isInProgress() || mScaleGestureDetector.isInProgress(); + mNativeMapView.invalidate(inProgress); } }); } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java index 8889e39af..8a78515da 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java @@ -88,8 +88,8 @@ class NativeMapView { nativeUpdate(mNativeMapViewPtr); } - public void invalidate() { - nativeOnInvalidate(mNativeMapViewPtr); + public void invalidate(boolean inProgress) { + nativeOnInvalidate(mNativeMapViewPtr, inProgress); } public void resizeView(int width, int height) { @@ -438,7 +438,7 @@ class NativeMapView { private native void nativeUpdate(long nativeMapViewPtr); - private native void nativeOnInvalidate(long nativeMapViewPtr); + private native void nativeOnInvalidate(long nativeMapViewPtr, boolean inProgress); private native void nativeViewResize(long nativeMapViewPtr, int width, int height); diff --git a/include/mbgl/android/native_map_view.hpp b/include/mbgl/android/native_map_view.hpp index 5e0df4dd4..e65c16869 100644 --- a/include/mbgl/android/native_map_view.hpp +++ b/include/mbgl/android/native_map_view.hpp @@ -49,7 +49,7 @@ public: void enableFps(bool enable); void updateFps(); - void onInvalidate(); + void onInvalidate(bool inProgress); void resizeView(int width, int height); void resizeFramebuffer(int width, int height);