summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkevin <kevin.li@mapbox.com>2018-12-04 13:12:40 +0800
committerkevin <kevin.li@mapbox.com>2018-12-04 13:38:19 +0800
commit0cc4492db8609b82585f9be2eceee30e7ca6b04e (patch)
tree39a245bda79384121367e5bbb3b0ceaf1ea5e212
parentaefcb1176a819c63d515cbf520ac4739cb05fcf7 (diff)
downloadqtlocation-mapboxgl-0cc4492db8609b82585f9be2eceee30e7ca6b04e.tar.gz
[Android] Add setPreferredFramesPerSecond for MapView
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java12
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java35
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java11
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml23
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml2
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
@@ -426,6 +426,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.
* <p>
* This method can be used to determine if the result of an asynchronous operation should be set.
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"/>
+ <Button
+ android:id="@+id/fps_60"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|start"
+ app:backgroundTint="@color/primary"
+ android:layout_margin="@dimen/fab_margin"
+ android:text="@string/fps60"
+ app:layout_anchor="@id/bottom_sheet"
+ app:layout_anchorGravity="top|end"/>
+
+ <Button
+ android:id="@+id/fps_30"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top|end"
+ android:layout_marginBottom="82dp"
+ app:backgroundTint="@color/primary"
+ android:layout_marginEnd="@dimen/fab_margin"
+ android:layout_marginRight="@dimen/fab_margin"
+ android:text="@string/fps30"
+ app:layout_anchor="@id/fps_60"
+ app:layout_anchorGravity="top"/>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
index 15a916fac9..45048f8b07 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Mapbox Android SDK TestApp</string>
+ <string name="fps30">fps30</string>
+ <string name="fps60">fps60</string>
</resources>