LibGDX 渲染和更新调用速度

LibGDX render and update calling speed

在 ApplicationAdapter class 中,我覆盖了 render() 方法并从那里绘制我的游戏。 我也有自己的方法:update() 在 render 方法中,这是我想要更新所有内容的地方。

据我所知,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();
}

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

您可以按照上两节中 here 的描述进行真正固定的更新,但这样做的缺点是视觉卡顿或需要实现一帧延迟并提前插值。