From 0cc4492db8609b82585f9be2eceee30e7ca6b04e Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 4 Dec 2018 13:12:40 +0800 Subject: [Android] Add setPreferredFramesPerSecond for MapView --- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 12 ++++++++ .../mapboxsdk/maps/renderer/MapRenderer.java | 35 +++++++++++++++++++--- .../activity/maplayout/DebugModeActivity.java | 11 +++++++ .../src/main/res/layout/activity_debug_mode.xml | 23 ++++++++++++++ .../src/main/res/values/strings.xml | 2 ++ 5 files changed, 79 insertions(+), 4 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 fc9418c2d9..cef7242ff3 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 @@ -425,6 +425,18 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { } } + /** + * The preferred frame rate at which the map view is rendered, + * but it can't excess the ability of device hardware. + * + * @param preferredFramesPerSecond Can be set to arbitrary integer values. + */ + public void setPreferredFramesPerSecond(int preferredFramesPerSecond) { + if (mapRenderer != null) { + mapRenderer.setPreferredFramesPerSecond(preferredFramesPerSecond); + } + } + /** * Returns if the map has been destroyed. *

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 9617f94fce..9947fd3bc5 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 @@ -5,6 +5,7 @@ import android.support.annotation.CallSuper; import android.support.annotation.Keep; import android.support.annotation.NonNull; + import com.mapbox.mapboxsdk.log.Logger; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.storage.FileSource; @@ -26,7 +27,7 @@ public abstract class MapRenderer implements MapRendererScheduler { // Holds the pointer to the native peer after initialisation private long nativePtr = 0; - + private int preferredFramesPerSecond = Integer.MAX_VALUE; private MapboxMap.OnFpsChangedListener onFpsChangedListener; public MapRenderer(@NonNull Context context, String localIdeographFontFamily) { @@ -121,12 +122,38 @@ public abstract class MapRenderer implements MapRendererScheduler { private void updateFps() { frames++; long currentTime = System.nanoTime(); - double fps = 0; - if (currentTime - timeElapsed >= 1) { - fps = frames / ((currentTime - timeElapsed) / 1E9); + long timeCost = currentTime - timeElapsed; + + if (timeCost >= 1) { + double fps = frames / ((timeCost) / 1E9); + if (fps > preferredFramesPerSecond) { + try { + long millis = (long) (timeCost / 1E6 * (fps - preferredFramesPerSecond) / fps); + Thread.sleep(millis); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + long newCurrentTime = System.nanoTime(); + timeCost = newCurrentTime - timeElapsed; + fps = frames / ((timeCost) / 1E9); + } onFpsChangedListener.onFpsChanged(fps); timeElapsed = currentTime; frames = 0; } } + + /** + * The preferred frame rate at which this render is rendered, + * but it can't excess the ability of device hardware. + * + * @param preferredFramesPerSecond Can be set to arbitrary integer values. + */ + public void setPreferredFramesPerSecond(int preferredFramesPerSecond) { + if (preferredFramesPerSecond <= 0) { + // Not valid, just return + return; + } + this.preferredFramesPerSecond = preferredFramesPerSecond; + } } 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 f3ffedcd23..310b0a88a0 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 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Locale; import com.mapbox.mapboxsdk.testapp.utils.IdleZoomListener; + import timber.log.Timber; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.visibility; @@ -62,6 +63,7 @@ public class DebugModeActivity extends AppCompatActivity implements OnMapReadyCa setupMapView(savedInstanceState); setupDebugChangeView(); setupStyleChangeView(); + setupFpsChangeView(); } private void setupToolbar() { @@ -167,6 +169,15 @@ public class DebugModeActivity extends AppCompatActivity implements OnMapReadyCa }); } + private void setupFpsChangeView() { + findViewById(R.id.fps_30).setOnClickListener(view -> { + mapView.setPreferredFramesPerSecond(30); + }); + findViewById(R.id.fps_60).setOnClickListener(view -> { + mapView.setPreferredFramesPerSecond(60); + }); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); 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 c6f3c0e3f2..e6fbceecc6 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 @@ -79,6 +79,29 @@ app:layout_anchor="@id/bottom_sheet" app:layout_anchorGravity="bottom|end"/> +