gpt4 book ai didi

java - LibGDX渲染和更新调用速度

转载 作者:行者123 更新时间:2023-12-01 22:29:27 24 4
gpt4 key购买 nike

在 ApplicationAdapter 类中,我重写了 render() 方法并从那里绘制我的游戏。我还有一个自己的方法:渲染方法内的 update() ,这是我想要更新所有内容的地方。

据我所知,render() 方法每秒调用约 60 次。我不希望我的更新方法依赖于调用渲染方法的次数。我希望渲染方法能够渲染尽可能多的设备可以处理低于 60 FPS 的帧率。我还希望以固定速率调用更新方法:每秒 60 次。

<小时/>

我尝试在渲染方法中每秒调用更新方法 60 次,如下所示:

double beforeMillis;
double FPS=4; //test
double millisPassed=0;
int x=0;


@Override
public void render () {
beforeMillis=System.currentTimeMillis();
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(tex, x, 10);
batch.end();
millisPassed+=(System.currentTimeMillis()-beforeMillis);
if(millisPassed>=1000/FPS){
update();
millisPassed=0;
}
}

...但它每四秒更新一次。

<小时/>

有什么好的方法吗?预先感谢!

最佳答案

您发布的代码不会比较准确的时间,因为它忽略了 batch.end() 和下一次调用 render() 之间执行操作所花费的所有时间>,其中一些发生在 libgdx 后端。而且,如果您在 render 方法中绘制后进行更新,则始终会出现至少一帧视觉滞后。

libgdx 中固定时间步更新的基本实现如下:

static final double DT = 1/60.0;
static final int MAX_UPDATES_PER_FRAME = 3; //for preventing spiral of death
private long currentTimeMillis;

public void create() {
currentTimeMillis = System.currentTimeMillis();
}

public void render() {
long newTimeMillis = System.currentTimeMillis();
float frameTimeSeconds = (newTimeMillis - currentTimeMillis) / 1000f;
currentTimeMillis = newTimeMillis;

int updateCount = 0;
while (frameTimeSeconds > 0f && updateCount <= MAX_UPDATES_PER_FRAME) {
float deltaTimeSeconds = Math.min(frameTimeSeconds, DT);
update(deltaTimeSeconds);
frameTimeSeconds -= deltaTimeSeconds;
++updateCount;
}

draw();
}

这确实会导致更新每秒发生超过60次,因为它会使用“剩余内容”进行更新以保持视觉效果最新(无卡顿)。 update(float delta) 方法必须设计为使用可变的增量时间。

您可以按照 here 的描述进行真正修复的更新在最后两节中,但这具有视觉卡顿或需要实现一帧延迟并提前插值的缺点。

关于java - LibGDX渲染和更新调用速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com