summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java34
1 files changed, 26 insertions, 8 deletions
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..a9bea97836 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
@@ -27,6 +27,7 @@ public abstract class MapRenderer implements MapRendererScheduler {
// Holds the pointer to the native peer after initialisation
private long nativePtr = 0;
+ private double expectedRenderTime = 0;
private MapboxMap.OnFpsChangedListener onFpsChangedListener;
public MapRenderer(@NonNull Context context, String localIdeographFontFamily) {
@@ -75,11 +76,20 @@ public abstract class MapRenderer implements MapRendererScheduler {
@CallSuper
protected void onDrawFrame(GL10 gl) {
+ long startTime = System.nanoTime();
try {
nativeRender();
} catch (java.lang.Error error) {
Logger.e(TAG, error.getMessage());
}
+ long renderTime = System.nanoTime() - startTime;
+ if (renderTime < expectedRenderTime) {
+ try {
+ Thread.sleep((long) ((expectedRenderTime - renderTime) / 1E6));
+ } catch (InterruptedException ex) {
+ Logger.e(TAG, ex.getMessage());
+ }
+ }
if (onFpsChangedListener != null) {
updateFps();
}
@@ -115,18 +125,26 @@ public abstract class MapRenderer implements 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;
+ double fps = 1E9 / ((currentTime - timeElapsed));
+ onFpsChangedListener.onFpsChanged(fps);
+ timeElapsed = currentTime;
+ }
+
+ /**
+ * The max frame rate at which this render is rendered,
+ * but it can't excess the ability of device hardware.
+ *
+ * @param maximumFps Can be set to arbitrary integer values.
+ */
+ public void setMaximumFps(int maximumFps) {
+ if (maximumFps <= 0) {
+ // Not valid, just return
+ return;
}
+ expectedRenderTime = 1E9 / maximumFps;
}
}