Java 使用Thread.sleep()限制Libgdx游戏中的FPS(';行不通
我正在用libgdx为android开发一个小游戏,希望将fps限制在30以节省电池。问题是它不起作用。fps从60下降到56 下面是代码的一部分:(它位于渲染部分的末尾) 提前感谢…用户可能会使用此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线程将陷入睡眠状态,因此你的应用程序的响应性可能会稍差一些(尽
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;
}
}