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 的描述进行真正固定的更新,但这样做的缺点是视觉卡顿或需要实现一帧延迟并提前插值。
在 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 的描述进行真正固定的更新,但这样做的缺点是视觉卡顿或需要实现一帧延迟并提前插值。