Android OpenGL ES:限制每秒帧数

Android OpenGL ES:限制每秒帧数,android,opengl-es,opengl-es-2.0,frame-rate,Android,Opengl Es,Opengl Es 2.0,Frame Rate,我有一个问题,我的帧限制器工作非常不精确。我将目标帧数设置为每秒30帧,但得到的值介于10FPS和500FPS之间。我想我犯了一个大错,但我找不到。 这是应该限制FPS的类: public class FrameLimiter { private long interval; private long startTime; private long endTime; private long timeForOneFrame; /** Limits an unlimited loop. *

我有一个问题,我的帧限制器工作非常不精确。我将目标帧数设置为每秒30帧,但得到的值介于10FPS和500FPS之间。我想我犯了一个大错,但我找不到。 这是应该限制FPS的类:

public class FrameLimiter {

private long interval;
private long startTime;
private long endTime;
private long timeForOneFrame;

/** Limits an unlimited loop.
 * You should select a value above 25FPS!
 * @param FPS the target value of frames per second
 */
public FrameLimiter(int FPS){
    interval = 1000/FPS;
    startTime = System.currentTimeMillis();
}

/** Calling this method stops the current thread until enough time elapsed to reach the target FPS.
 */
public void limit(){
    endTime = System.currentTimeMillis();
    timeForOneFrame = endTime - startTime;

    if (timeForOneFrame < interval)
        try {
            Thread.sleep(interval - timeForOneFrame);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    startTime = System.currentTimeMillis();
}

/** Returns the current FPS measured against the time between two calls of limit().
 * This method just works in combination with limit()!
 * @return the current FPS.
 */
public int getFPS(){
    if(timeForOneFrame <= 0){
        return 0;
    }else{
        return (int) (1000/timeForOneFrame);
      }
  }
}

非常感谢您的帮助。

无论您有什么理由,我强烈建议不要在函数中使用sleep()

我用Android开发了很多游戏,这些游戏在几乎所有的Android设备上都运行得很好

往这边走。方向向量*增量*值(对象应在1秒内移动)

增量为(滴答声-最后滴答声)/1000.f

滴答声是ms

System.currentTimeMillis();
此函数在Android(正在中断操作系统)中非常不精确,请改用:

SystemClock.elapsedRealtime();

SystemClock.elapsedRealtime();
SystemClock.sleep(millis); //not need try block, instead of 

Thread.sleep(millis);//need try block