【问题标题】:deWiTTERS Game Loop in LibGDXLibGDX 中的 deWiTTERS 游戏循环
【发布时间】:2013-10-31 06:30:47
【问题描述】:

我是初学者,我想要一个完整的 LibGDX 示例,如何将帧速率限制为 50 或 60。此外,如何使用简单的示例代码在游戏状态之间进行插值 例如deWiTTERS 游戏循环:

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

有一个 Gdx.graphics.setVsync() 方法(通用 = 后端独立),但它在 0.9.1 中不存在,仅在 Nightlies 中存在。

“在固定时间步长上依赖 vsync 是一个非常糟糕的主意。它会破坏几乎所有硬件。

请参阅 LwjglApplicationConfiguration,其中有一个标志可以让我们使用切换 gpu/软件 vsynching。玩弄它。”(马里奥)

请注意,这些都不会将帧速率限制为特定值...如果您出于某种原因真的需要限制帧速率,如果 xxx ms 没有通过,您必须自己通过从渲染调用返回来处理它自上次渲染调用以来。

【问题讨论】:

  • 你为什么不使用睡床?或者至少比 0.9.1 更新?睡衣其实很稳定。

标签: android libgdx


【解决方案1】:

LibGDX 作为一个完整的游戏引擎,它自己处理这样的事情。您可以在游戏开始时进行配置,至少在最新的夜间版本中是这样。

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 方法,但您可以像上面的示例那样自行拆分游戏逻辑更新和渲染。

【讨论】:

  • 好的告诉我在 AndroidApplicationConfiguration 的情况下我怎样才能达到同样的效果。
  • @jay_singh 看看github.com/libgdx/libgdx/wiki/Starter-classes-%26-configurationgithub.com/libgdx/libgdx/wiki/…,它可以在开始设置所有项目时为您节省大量时间,而且它很容易扩展。 Android 配置也一样
  • @jay_singh 哦,我刚刚注意到您无法通过 AndroidAppConfig 配置它。我想那是因为智能手机无论如何都对 FPS 有内部限制(以节省能源)。例如,我的 Google Nexus S 以 60FPS 自动停止
  • 在我看来,这种方法没有使用 deWitters 游戏循环,因为没有插值。相反,更新和渲染都设置为 60fps。这是正确的吗?
  • @twiz 是的,你是对的。但在大多数情况下,您不需要真正的 deWitters 游戏循环。如果这样做,仍然可以在 libgdx 游戏循环中实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多