deWiTTERS在LibGDX中的游戏循环

4

我是个新手,想要一个完整的LibGDX例子,如何将帧率限制在50或60。还需要一个简单的示例代码来管理游戏状态之间的插值,例如deWiTTERS游戏循环:

@Override
public void render()
{
    float deltaTime = Gdx.graphics.getDeltaTime();
    Update(deltaTime);
    Render(deltaTime);
}

有一个Gdx.graphics.setVsync()方法(通用 = 与后端无关),但它不在0.9.1中,只在夜间版本中提供。

“依靠垂直同步来实现固定时间步长是一个非常糟糕的想法。几乎所有硬件都会出问题。”

请查看LwjglApplicationConfiguration,其中有一个标志,可以使用开关GPU /软件垂直同步。尝试一下。”(马里奥)

请注意,这些都不会将帧速率限制为特定值... 如果您真的需要出于某种原因限制帧速率,则必须自己处理,即如果xxx毫秒自上次呈现调用以来未经过,则从呈现调用返回。


为什么不使用夜间版本?或者至少使用比0.9.1更新的版本?实际上,夜间版本非常稳定。 - noone
1个回答

6
作为一个完整的游戏引擎,LibGDX可以自行处理此类问题。您可以在游戏开始时进行配置,至少在最新的nightlies版本中可以这样做。
public static void main(String[] args) {
    LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
    cfg.title = "Example";
    cfg.useGL20 = false;
    cfg.width = 800;
    cfg.height = 480;
    cfg.vSyncEnabled = true;
    cfg.foregroundFPS = 60;

    new LwjglApplication(new ExampleGame(), cfg);
}

现在您的渲染循环将被限制为每秒60次调用。关于实际实现,您应该使用一个GameScreensScreen接口已经有了一个render方法,它可能看起来像这样:

public void render(deltaTime )
{
    ...
    updateAllEntities(deltaTime);
    ...
    renderAllEntities(deltaTime);
    ...
}

LibGDX只调用render方法,但你可以根据上面的例子自行分离游戏逻辑更新和渲染。


1
好的,请告诉我在AndroidApplicationConfiguration的情况下,我该如何实现相同的功能。 - jay_singh
@jay_singh 请查看 https://github.com/libgdx/libgdx/wiki/Starter-classes-%26-configuration 和 https://github.com/libgdx/libgdx/wiki/Project-setup%2C-running-%26-debugging#using-libgdx-setup,这可以节省您在开始设置所有项目时的大量时间,并且易于扩展。 Android配置也是一样的。 - noone
@jay_singh 噢,我刚注意到你不能通过AndroidAppConfig进行配置。我想这是因为智能手机无论如何都有一个内部FPS限制(以节省能源)。例如,我的Google Nexus S自动停止在60FPS。 - noone
在我看来,这种方法似乎没有使用deWitters游戏循环,因为它没有插值。相反,更新和渲染都设置为60fps。这正确吗? - twiz
@twiz 是的,你说得对。在大多数情况下,你不需要一个真正的deWitters游戏循环。如果你需要,仍然可以在libgdx游戏循环中实现它。 - noone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接