Add frame rate limitiing on Android.

If frameRate is set in MainActivity, the application will limit the frame rate to the value defined.  This can be used to save battery life.
experimental
iwgeric 10 years ago
parent 3ee52c38ed
commit 3a82c9eca1
  1. 9
      jme3-android/src/main/java/com/jme3/app/AndroidHarness.java
  2. 23
      jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java

@ -88,6 +88,13 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
*/ */
protected int eglStencilBits = 0; protected int eglStencilBits = 0;
/**
* Set the desired frame rate. If frameRate > 0, the application
* will be capped at the desired frame rate.
* (default = -1, no frame rate cap)
*/
protected int frameRate = -1;
/** /**
* Sets the type of Audio Renderer to be used. * Sets the type of Audio Renderer to be used.
* <p> * <p>
@ -239,6 +246,8 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
settings.setResolution(disp.getWidth(), disp.getHeight()); settings.setResolution(disp.getWidth(), disp.getHeight());
settings.setAudioRenderer(audioRendererType); settings.setAudioRenderer(audioRendererType);
settings.setFrameRate(frameRate);
// Create application instance // Create application instance
try { try {
if (app == null) { if (app == null) {

@ -75,7 +75,8 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
protected SystemListener listener; protected SystemListener listener;
protected boolean autoFlush = true; protected boolean autoFlush = true;
protected AndroidInputHandler androidInput; protected AndroidInputHandler androidInput;
protected int minFrameDuration = 0; // No FPS cap protected long minFrameDuration = 0; // No FPS cap
protected long lastUpdateTime = 0;
protected JoyInput androidSensorJoyInput = null; protected JoyInput androidSensorJoyInput = null;
public OGLESContext() { public OGLESContext() {
@ -225,6 +226,12 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
androidInput.loadSettings(settings); androidInput.loadSettings(settings);
} }
if (settings.getFrameRate() > 0) {
minFrameDuration = (long)(1000d / (double)settings.getFrameRate()); // ms
logger.log(Level.FINE, "Setting min tpf: {0}ms", minFrameDuration);
} else {
minFrameDuration = 0;
}
} }
@Override @Override
@ -320,23 +327,25 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
throw new IllegalStateException("onDrawFrame without create"); throw new IllegalStateException("onDrawFrame without create");
} }
long milliStart = System.currentTimeMillis();
listener.update(); listener.update();
if (autoFlush) { if (autoFlush) {
renderer.onFrame(); renderer.onFrame();
} }
long milliDelta = System.currentTimeMillis() - milliStart; long updateDelta = System.currentTimeMillis() - lastUpdateTime;
// Enforce a FPS cap // Enforce a FPS cap
if (milliDelta < minFrameDuration) { if (updateDelta < minFrameDuration) {
//logger.log(Level.FINE, "Time per frame {0}", milliDelta); // logger.log(Level.INFO, "lastUpdateTime: {0}, updateDelta: {1}, minTimePerFrame: {2}",
// new Object[]{lastUpdateTime, updateDelta, minTimePerFrame});
try { try {
Thread.sleep(minFrameDuration - milliDelta); Thread.sleep(minFrameDuration - updateDelta);
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
} }
lastUpdateTime = System.currentTimeMillis();
} }
} }

Loading…
Cancel
Save