【问题标题】:Move camera without lag in libgdx在 libgdx 中移动相机没有延迟
【发布时间】:2016-03-16 03:32:10
【问题描述】:

我刚刚使用 libgdx 开始了一个小项目,我注意到相机有点落后于鼠标。我是这样移动的:(我已经删掉了其他所有内容)

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    screenXlast = screenX;
    screenYlast = screenY;

    if (button == Input.Buttons.RIGHT || pointer > 0) {
        rightMouseKlicked = true;

    return true;
}


@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    if (button == Input.Buttons.RIGHT) {
        rightMouseKlicked = false;
    }

    return false;
}

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {

    if (rightMouseKlicked) {

        gamecam.translate((screenXlast - screenX) * gamecam.zoom, (screenY -
            screenYlast) * gamecam.zoom);

    }
    screenXlast = screenX;
    screenYlast = screenY;
    return false;
}

游戏以 60fps 的速度运行,但输出似乎延迟了几帧。 (移动时鼠标光标不会停留在地图上的同一位置)

有没有其他方法可以让相机与鼠标保持一致?

【问题讨论】:

  • gamecam.translate((screenXlast - screenX) * gamecam.zoom, (screenY - screenYlast) * gamecam.zoom) 缺少根据实际 fps 更正转换的增量值。尽管您的问题可能还有其他原因,但您应该始终将 delta 应用于您的转换。
  • 请出示您的resize 方法。
  • resize 方法是什么意思?
  • 您的游戏或屏幕类中的那个。试图找出屏幕尺寸和相机尺寸之间的关系。
  • 我想你误解了我的问题。地图正在移动到正确的位置,但它在鼠标后面大约 50 毫秒。这是截图:directupload.net/file/d/4295/i8utxi4u_png.htm

标签: java camera libgdx lag


【解决方案1】:

据我所知,libgdx 中的事件进入堆栈。有可能在事件实际发生几毫秒后接收到事件。

您可以看到,如果您绘制一个演员或触摸拖动事件位置的纹理 - 如果您快速拖动,您将看到绘制的纹理始终位于您的鼠标(或手机上的取景器)后面。

正如@Jankapunkt 所说,您可以尝试将位置乘以增量时间(Gdx.graphics.getDeltaTime()),但我不确定它是否会有所帮助

【讨论】:

  • 为什么我需要 delta,但它不依赖于它?在每一帧上,无论渲染需要多长时间,我都希望凸轮移动的幅度与鼠标移动的幅度一样多。我的代码工作得很好,你可以完美地在地图上拖动,但唯一的问题是,它太迟钝了。我确信这与“缺失”的三角洲无关。编辑:Ups 这是对其他评论的回答。点击了错误的按钮
  • 当我乘以自上一帧以来它移动的像素数量时(我猜这就是乘以位置的意思)它可能会更好地赶上鼠标但是当你停止鼠标时它会过冲。我不希望那样。在其他游戏/程序中,您可以用鼠标移动东西而不会出现延迟。用 libgdx 根本不可能吗?
  • 难道不能在队列中获取最新的输入而忽略其余的吗?它必须是可能的。在 Windows 中,当您四处移动窗口时,它们会完美地粘在鼠标上。
  • 适用于 Windows 还是智能手机?
  • 两者都可以运行。但对于我的问题,它不应该有所作为。
【解决方案2】:

您正在计算移动的屏幕像素,但未缩放到相机视口的大小。修改如下:

public boolean touchDragged(int screenX, int screenY, int pointer) {

    if (rightMouseKlicked) {
        float scale = gamecam.zoom * gamecam.viewportWidth / (float)(Gdx.graphics.getWidth);
        gamecam.translate((screenXlast - screenX) * scale , (screenY -
            screenYlast) * scale );

    }
    screenXlast = screenX;
    screenYlast = screenY;
    return false;
}

另外请记住,典型鼠标的更新速率非常低(我认为约为 10 FPS)。如果您发现相机移动过于不稳定,则必须计算鼠标移动速度并推断鼠标的位置,并在此基础上添加平滑算法。 See here for discussion(3D 但仍普遍适用)。

【讨论】:

  • 您的代码给出的结果与我的完全相同。我使用 gamecam.zoom 对其进行了缩放。
  • 我现在用手机拍的。暂停视频时,您可以看到最后 5 个光标,您可以清楚地看到,地图滞后了 3 帧,即 50 毫秒。
  • 哦,鼠标以相同的帧率更新,图形也更新了。我把这段代码放在 touchDragged() 里面: System.out.println(1.0/((double)(System.nanoTime() - lastTime) / 1000000000.0));最后时间 = System.nanoTime();它打印的数字与 fraps 显示的数字相同。
  • 如果结果相同,那么您的相机尺寸必须与您的屏幕尺寸相同。我想我误解了你所说的滞后的意思。你有高端鼠标吗?我的更新速度约为 10 FPS。
  • 我有一个 Razer Naga。我在上面贴了一个截图,所以你可以明白我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2014-07-18
  • 1970-01-01
相关资源
最近更新 更多