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.
This commit is contained in:
parent
3ee52c38ed
commit
3a82c9eca1
@ -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…
x
Reference in New Issue
Block a user