在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;
}
}
...但它每四秒更新一次。
有什么好办法吗?提前致谢!
答案 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所述进行真正固定的更新,但这样做的好处是视觉口吃或需要实现一帧延迟并提前插值。