[Android] Add setPreferredFramesPerSecond for MapView (#13498)
* [Android] Add setPreferredFramesPerSecond for MapView
This commit is contained in:
@@ -421,6 +421,18 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The maximum frame rate at which the map view 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 (mapRenderer != null) {
|
||||
mapRenderer.setMaximumFps(maximumFps);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the map has been destroyed.
|
||||
* <p>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user