LibGDX渲染和更新调用速度

时间:2015-01-23 15:54:24

标签: java libgdx render

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

我知道render()方法每秒调用~60次。 我不希望我的更新方法取决于调用render方法的次数。 我希望渲染方法尽可能多地渲染设备可以处理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;
    }
} 

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


有什么好办法吗?提前致谢!

1 个答案:

答案 0 :(得分:3)

您发布的代码无法比较准确的时间,因为它忽略了在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次,因为它会更新&#34;剩余时间&#34;使视觉保持最新(没有口吃)。必须将update(float delta)方法设计为使用变量增量时间。

您可以在最后两节中按照here所述进行真正固定的更新,但这样做的好处是视觉口吃或需要实现一帧延迟并提前插值。