Java 使用Thread.sleep()限制Libgdx游戏中的FPS(';行不通

Java 使用Thread.sleep()限制Libgdx游戏中的FPS(';行不通,java,android,libgdx,limit,frame-rate,Java,Android,Libgdx,Limit,Frame Rate,我正在用libgdx为android开发一个小游戏,希望将fps限制在30以节省电池。问题是它不起作用。fps从60下降到56 下面是代码的一部分:(它位于渲染部分的末尾) 提前感谢…用户可能会使用此 Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime())); 将30的值更改为所需的帧速率。您可以在Android上寻找另一种降低帧速率的方法。就目前情况而言,你的应用程序的UI线程将陷入睡眠状态,因此你的应用程序的响应性可能会稍差一些(尽

我正在用libgdx为android开发一个小游戏,希望将fps限制在30以节省电池。问题是它不起作用。fps从60下降到56

下面是代码的一部分:(它位于渲染部分的末尾)

提前感谢…

用户可能会使用此

Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime()));
将30的值更改为所需的帧速率。

您可以在Android上寻找另一种降低帧速率的方法。就目前情况而言,你的应用程序的UI线程将陷入睡眠状态,因此你的应用程序的响应性可能会稍差一些(尽管睡眠30秒其实并不长)


根据您的游戏,非连续渲染支持可能会让您进一步降低帧速率(任何时候图形没有变化,也没有预期的输入,您都不需要绘制新帧)。

我在Internet上找到了一个解决方案,并对其进行了一些修改。它工作完美!只需将此函数添加到类中:

private long diff, start = System.currentTimeMillis();

public void sleep(int fps) {
    if(fps>0){
      diff = System.currentTimeMillis() - start;
      long targetDelay = 1000/fps;
      if (diff < targetDelay) {
        try{
            Thread.sleep(targetDelay - diff);
          } catch (InterruptedException e) {}
        }   
      start = System.currentTimeMillis();
    }
}
import com.badlogic.gdx.utils.TimeUtils;
公共类FPS限制器{
private long previousTime=TimeUtils.nanoTime();
private long currentTime=TimeUtils.nanoTime();
私有长deltaTime=0;
私人浮式fps;
公共fps限制器(浮动fps){
this.fps=fps;
}
公共无效延迟(){
currentTime=TimeUtils.nanoTime();
deltaTime+=当前时间-上一个时间;
而(deltaTime<100000000/fps){
previousTime=当前时间;
长差=(长)(100000000/fps-延迟时间);
如果(差值/1000000>1){
试一试{
Thread.currentThread().sleep(diff/1000000-1);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
currentTime=TimeUtils.nanoTime();
deltaTime+=当前时间-上一个时间;
previousTime=当前时间;
}
deltaTime-=100000000/fps;
}
}

看起来它不是完全可移植的(iOS仍然不支持此功能?)最好不要依赖FPS,因为这个答案是错误的,不要使用它!!getDeltaTime()以秒为单位返回时间,其余以毫秒为单位。除此之外,除法是基于整数的,所以你会得到过多的舍入。为什么这是可以接受的@埃米亚兹,你能接受这个吗?
Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime()));
private long diff, start = System.currentTimeMillis();

public void sleep(int fps) {
    if(fps>0){
      diff = System.currentTimeMillis() - start;
      long targetDelay = 1000/fps;
      if (diff < targetDelay) {
        try{
            Thread.sleep(targetDelay - diff);
          } catch (InterruptedException e) {}
        }   
      start = System.currentTimeMillis();
    }
}
int fps = 30; //limit to 30 fps
//int fps = 0;//without any limits
@Override
public void render() {
   //draw something you need
   sleep(fps); 
}
import com.badlogic.gdx.utils.TimeUtils;

public class FPSLimiter {

    private long previousTime = TimeUtils.nanoTime();
    private long currentTime = TimeUtils.nanoTime();
    private long deltaTime = 0;
    private float fps;

    public FPSLimiter(float fps) {
        this.fps = fps;
    }

    public void delay() {
        currentTime = TimeUtils.nanoTime();
        deltaTime += currentTime - previousTime;
        while (deltaTime < 1000000000 / fps) {
            previousTime = currentTime;
            long diff = (long) (1000000000 / fps - deltaTime);
            if (diff / 1000000 > 1) {
                try {
                    Thread.currentThread().sleep(diff / 1000000 - 1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            currentTime = TimeUtils.nanoTime();
            deltaTime += currentTime - previousTime;
            previousTime = currentTime;
        }
        deltaTime -= 1000000000 / fps;
    }
}