Quellcode durchsuchen

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.

iwgeric vor 10 Jahren
Ursprung
Commit
3a82c9eca1

+ 9 - 0
jme3-android/src/main/java/com/jme3/app/AndroidHarness.java

@@ -88,6 +88,13 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
      */
     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.
      * <p>
@@ -239,6 +246,8 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
             settings.setResolution(disp.getWidth(), disp.getHeight());
             settings.setAudioRenderer(audioRendererType);
 
+            settings.setFrameRate(frameRate);
+
             // Create application instance
             try {
                 if (app == null) {

+ 16 - 7
jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java

@@ -75,7 +75,8 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
     protected SystemListener listener;
     protected boolean autoFlush = true;
     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;
 
     public OGLESContext() {
@@ -225,6 +226,12 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
             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
@@ -320,23 +327,25 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
                 throw new IllegalStateException("onDrawFrame without create");
             }
 
-            long milliStart = System.currentTimeMillis();
-
             listener.update();
             if (autoFlush) {
                 renderer.onFrame();
             }
 
-            long milliDelta = System.currentTimeMillis() - milliStart;
+            long updateDelta = System.currentTimeMillis() - lastUpdateTime;
 
             // Enforce a FPS cap
-            if (milliDelta < minFrameDuration) {
-                //logger.log(Level.FINE, "Time per frame {0}", milliDelta);
+            if (updateDelta < minFrameDuration) {
+//                    logger.log(Level.INFO, "lastUpdateTime: {0}, updateDelta: {1}, minTimePerFrame: {2}",
+//                            new Object[]{lastUpdateTime, updateDelta, minTimePerFrame});
                 try {
-                    Thread.sleep(minFrameDuration - milliDelta);
+                    Thread.sleep(minFrameDuration - updateDelta);
                 } catch (InterruptedException e) {
                 }
             }
+
+            lastUpdateTime = System.currentTimeMillis();
+
         }
     }