From 9bdaba97e789bf42108a3f1f66193e3176b0d31a Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Mon, 18 Sep 2017 19:00:34 +0300 Subject: [android] re-implemented the fps listener api --- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 15 ------- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 1 + .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 47 +++++++++++++--------- .../mapboxsdk/maps/renderer/MapRenderer.java | 26 ++++++++++++ .../activity/maplayout/DebugModeActivity.java | 12 ++++++ .../src/main/res/layout/activity_debug_mode.xml | 11 +++++ platform/android/src/native_map_view.cpp | 37 ----------------- platform/android/src/native_map_view.hpp | 8 ---- 8 files changed, 77 insertions(+), 80 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 271bd155be..9f6cd7ab5e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -435,21 +435,6 @@ public class MapView extends FrameLayout { nativeMapView.onLowMemory(); } - // Called when debug mode is enabled to update a FPS counter - // Called via JNI from NativeMapView - // Forward to any listener - protected void onFpsChanged(final double fps) { - final MapboxMap.OnFpsChangedListener listener = mapboxMap.getOnFpsChangedListener(); - if (listener != null) { - post(new Runnable() { - @Override - public void run() { - listener.onFpsChanged(fps); - } - }); - } - } - /** *

* Loads a new map style from the specified URL. diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 6c7670b91c..3afc29f99b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -1711,6 +1711,7 @@ public final class MapboxMap { */ public void setOnFpsChangedListener(@Nullable OnFpsChangedListener listener) { onFpsChangedListener = listener; + nativeMapView.setOnFpsChangedListener(listener); } // used by MapView diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 5be74258fd..3ce6aab581 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -20,7 +20,6 @@ import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.geometry.ProjectedMeters; import com.mapbox.mapboxsdk.maps.renderer.MapRenderer; -import com.mapbox.mapboxsdk.maps.renderer.MapRendererScheduler; import com.mapbox.mapboxsdk.storage.FileSource; import com.mapbox.mapboxsdk.style.layers.CannotAddLayerException; import com.mapbox.mapboxsdk.style.layers.Filter; @@ -54,7 +53,7 @@ final class NativeMapView { private final FileSource fileSource; // Used to schedule work on the MapRenderer Thread - private MapRendererScheduler scheduler; + private MapRenderer mapRenderer; // Device density private final float pixelRatio; @@ -71,7 +70,7 @@ final class NativeMapView { // public NativeMapView(final MapView mapView, MapRenderer mapRenderer) { - this.scheduler = mapRenderer; + this.mapRenderer = mapRenderer; this.mapView = mapView; Context context = mapView.getContext(); @@ -106,7 +105,7 @@ final class NativeMapView { return; } - scheduler.requestRender(); + mapRenderer.requestRender(); } public void resizeView(int width, int height) { @@ -510,13 +509,6 @@ final class NativeMapView { return nativeGetDebug(); } - public void setEnableFps(boolean enable) { - if (isDestroyedOn("setEnableFps")) { - return; - } - nativeSetEnableFps(enable); - } - public boolean isFullyLoaded() { if (isDestroyedOn("isFullyLoaded")) { return false; @@ -835,13 +827,6 @@ final class NativeMapView { } } - protected void onFpsChanged(double fps) { - if (isDestroyedOn("OnFpsChanged")) { - return; - } - mapView.onFpsChanged(fps); - } - protected void onSnapshotReady(Bitmap mapContent) { if (isDestroyedOn("OnSnapshotReady")) { return; @@ -947,8 +932,6 @@ final class NativeMapView { private native boolean nativeGetDebug(); - private native void nativeSetEnableFps(boolean enable); - private native boolean nativeIsFullyLoaded(); private native void nativeSetReachability(boolean status); @@ -1076,4 +1059,28 @@ final class NativeMapView { nativeTakeSnapshot(); } + public void setOnFpsChangedListener(final MapboxMap.OnFpsChangedListener listener) { + mapRenderer.queueEvent(new Runnable() { + + @Override + public void run() { + mapRenderer.setOnFpsChangedListener(new MapboxMap.OnFpsChangedListener() { + + @Override + public void onFpsChanged(final double fps) { + mapView.post(new Runnable() { + + @Override + public void run() { + listener.onFpsChanged(fps); + } + + }); + } + + }); + } + + }); + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java index 772ecb79fb..3f43522e01 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java @@ -3,6 +3,7 @@ package com.mapbox.mapboxsdk.maps.renderer; import android.content.Context; import android.opengl.GLSurfaceView; +import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.storage.FileSource; import javax.microedition.khronos.egl.EGLConfig; @@ -22,6 +23,8 @@ public class MapRenderer implements GLSurfaceView.Renderer, MapRendererScheduler private final GLSurfaceView glSurfaceView; + private MapboxMap.OnFpsChangedListener onFpsChangedListener; + public MapRenderer(Context context, GLSurfaceView glSurfaceView) { this.glSurfaceView = glSurfaceView; @@ -33,6 +36,10 @@ public class MapRenderer implements GLSurfaceView.Renderer, MapRendererScheduler nativeInitialize(this, fileSource, pixelRatio, programCacheDir); } + public void setOnFpsChangedListener(MapboxMap.OnFpsChangedListener listener) { + onFpsChangedListener = listener; + } + @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { nativeOnSurfaceCreated(); @@ -65,6 +72,10 @@ public class MapRenderer implements GLSurfaceView.Renderer, MapRendererScheduler @Override public void onDrawFrame(GL10 gl) { nativeRender(); + + if (onFpsChangedListener != null) { + updateFps(); + } } /** @@ -116,4 +127,19 @@ public class MapRenderer implements GLSurfaceView.Renderer, MapRendererScheduler private native void nativeRender(); + private long frames; + private long timeElapsed; + + private void updateFps() { + frames++; + long currentTime = System.nanoTime(); + double fps = 0; + if (currentTime - timeElapsed >= 1) { + fps = frames / ((currentTime - timeElapsed) / 1E9); + onFpsChangedListener.onFpsChanged(fps); + timeElapsed = currentTime; + frames = 0; + } + } + } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java index ec7df65d59..6134b4cb7a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java @@ -26,6 +26,7 @@ import com.mapbox.mapboxsdk.style.layers.Property; import com.mapbox.mapboxsdk.testapp.R; import java.util.List; +import java.util.Locale; import timber.log.Timber; @@ -104,6 +105,17 @@ public class DebugModeActivity extends AppCompatActivity implements OnMapReadyCa setupNavigationView(mapboxMap.getLayers()); setupZoomView(); + setFpsView(); + } + + private void setFpsView() { + final TextView fpsView = (TextView) findViewById(R.id.fpsView); + mapboxMap.setOnFpsChangedListener(new MapboxMap.OnFpsChangedListener() { + @Override + public void onFpsChanged(double fps) { + fpsView.setText(String.format(Locale.US,"FPS: %4.2f", fps)); + } + }); } private void setupNavigationView(List layerList) { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml index 5b0a4a2cdb..c6f3c0e3f2 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml @@ -35,6 +35,17 @@ app:layout_anchor="@id/bottom_sheet" app:layout_anchorGravity="bottom|start"/> + + NativeMapView::getCameraPosition(jni::JNIEnv& env) { return CameraPosition::New(env, map->getCameraOptions(insets)); } @@ -457,12 +453,10 @@ void NativeMapView::setDebug(JNIEnv&, jni::jboolean debug) { DebugOptions debugOptions = debug ? DebugOptions::TileBorders | DebugOptions::ParseStatus | DebugOptions::Collision : DebugOptions::NoDebug; map->setDebug(debugOptions); - fpsEnabled = debug; } void NativeMapView::cycleDebugOptions(JNIEnv&) { map->cycleDebugOptions(); - fpsEnabled = map->getDebug() != DebugOptions::NoDebug; } jni::jboolean NativeMapView::getDebug(JNIEnv&) { @@ -926,36 +920,6 @@ jni::jboolean NativeMapView::getPrefetchesTiles(JNIEnv&) { return jni::jboolean(map->getPrefetchZoomDelta() > 0); } -// Private methods // - -// TODO -void NativeMapView::updateFps() { - if (!fpsEnabled) { - return; - } - - static int frames = 0; - static int64_t timeElapsed = 0LL; - - frames++; - struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - int64_t currentTime = now.tv_sec * 1000000000LL + now.tv_nsec; - - if (currentTime - timeElapsed >= 1) { - fps = frames / ((currentTime - timeElapsed) / 1E9); - mbgl::Log::Info(mbgl::Event::Render, "FPS: %4.2f", fps); - timeElapsed = currentTime; - frames = 0; - } - - assert(vm != nullptr); - - android::UniqueEnv _env = android::AttachEnv(); - static auto onFpsChanged = javaClass.GetMethod(*_env, "onFpsChanged"); - javaPeer->Call(*_env, onFpsChanged, fps); -} - // Static methods // jni::Class NativeMapView::javaClass; @@ -1004,7 +968,6 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::setVisibleCoordinateBounds, "nativeSetVisibleCoordinateBounds"), METHOD(&NativeMapView::setContentPadding, "nativeSetContentPadding"), METHOD(&NativeMapView::scheduleSnapshot, "nativeTakeSnapshot"), - METHOD(&NativeMapView::enableFps, "nativeSetEnableFps"), METHOD(&NativeMapView::getCameraPosition, "nativeGetCameraPosition"), METHOD(&NativeMapView::updateMarker, "nativeUpdateMarker"), METHOD(&NativeMapView::addMarkers, "nativeAddMarkers"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 9102f8463b..72c7b1a9eb 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -142,8 +142,6 @@ public: void scheduleSnapshot(jni::JNIEnv&); - void enableFps(jni::JNIEnv&, jni::jboolean enable); - jni::Object getCameraPosition(jni::JNIEnv&); void updateMarker(jni::JNIEnv&, jni::jlong, jni::jdouble, jni::jdouble, jni::String); @@ -242,10 +240,6 @@ public: jni::jboolean getPrefetchesTiles(JNIEnv&); -private: - - void updateFps(); - private: std::unique_ptr rendererFrontend; @@ -258,8 +252,6 @@ private: std::string apiKey; float pixelRatio; - bool fpsEnabled = false; - double fps = 0.0; // Minimum texture size according to OpenGL ES 2.0 specification. int width = 64; -- cgit v1.2.1