【问题标题】:Physics update lag物理更新滞后
【发布时间】:2021-04-04 21:09:25
【问题描述】:

我遇到了一个问题,在一个线程上执行所有操作可能会导致一些滞后。问题是,当我开始创建大量新对象(例如每秒 300 个)时,我的物理速率会下降。

我对每一帧的所有渲染对象进行排序,所以我会知道按什么顺序绘制哪个,这可能是它只能处理这么少的原因,但即使删除了,仍然会有像 max 操作每次更新,否则物理会滞后。

关于如何实现正确的 zOrder 或消除可能的物理滞后的任何想法?

或者将物理与渲染分离...?

我的游戏循环:

while (isRunning) {

    currentFrameTime = System.nanoTime();
    passedTime = currentFrameTime - lastFrameTime;
    lastFrameTime = currentFrameTime;

    physicsPassedTime += passedTime;
    updatePassedTime += passedTime;

    if (physicsPassedTime >= (double) 1_000_000_000 / physicsRate) {

        physicsPassedTime = 0;

        PhysicsUpdate();
    }

    if (updatePassedTime >= (double) 1_000_000_000 / refreshRate) {

        updatePassedTime = 0;

        Update();
        Render();
        LateUpdate();
    }
}

【问题讨论】:

  • 大多数游戏引擎将物理与渲染分离,并且仅在指定的更新间隔内执行物理。他们还可以根据对象的速度对对象进行排序,并减少更新移动较慢的对象的频率。
  • 1) 方法名称不应以大写字符开头。遵循 JDK 中使用的约定。 2)不要使用while循环来控制渲染器。大部分时间将花在无所事事的循环上。相反,请使用 Swing Timer 来安排动画。
  • @SMAEL 当然。我试图理解的关键部分是你不能只在第一个循环之后插入第二个循环,因为第一个循环是一个无限循环,所以你永远不会进入第二个循环。您需要两个单独的线程来并行运行。这些线程中的一个或两个可以/应该是计时器,但至关重要的是它们是两个独立的线程。
  • @CharlieArmstrong 对,对不起,如果我也没有说清楚。是的,我知道,物理学将在第二个线程上。既然你已经是第二个建议计时器的人了,我也会看看这个
  • @RichardBarker 我不知道怎么做,但我想我以某种方式利用 GPU 进行渲染,因为当我解锁 FPS 时(我在一个简单的演示中获得了超过 600k),我的 GPU 掉了直接喜欢 80% 的使用率。我不会假装我知道它是如何工作的(我不知道),但它似乎很有效,而且这是一个学校项目,所以我对它的进展非常满意。

标签: java game-loop


【解决方案1】:

看起来最好的解决方案(如 cmets 中所建议的那样)是在第二个线程上运行第二个循环,只更新物理,其他所有内容都在另一个线程上。

这样掉帧不应该干预物理更新。

编辑:实现了这一点,并且像魅力一样工作。我会在有能力的时候标记答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2012-06-02
    • 2014-08-21
    • 2021-05-23
    相关资源
    最近更新 更多