Java 物理更新滞后

Java 物理更新滞后,java,game-loop,Java,Game Loop,我遇到了一个问题,在单个线程上执行所有操作可能会导致一些延迟。问题是,当我开始创建大量新对象时(比如每秒300个),我的物理速率会下降 我对每一帧的所有渲染对象进行排序,这样我就可以知道以何种顺序绘制哪一个对象,这可能就是为什么它只能处理很少的对象的原因,但即使删除了这一点,每次更新仍会有像max这样的操作,否则物理将滞后 关于如何实现正确的zOrder或消除可能的物理滞后有什么想法吗 或者从渲染中分离物理 我的游戏循环: while (isRunning) { currentFram

我遇到了一个问题,在单个线程上执行所有操作可能会导致一些延迟。问题是,当我开始创建大量新对象时(比如每秒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循环来控制渲染器。大部分时间将花在循环上,什么也不做。相反,请使用摆动计时器来安排动画。@SMAEL-Sure。我想说的关键一点是,你不能把第二个循环放在第一个循环之后,因为第一个循环是一个无限循环,所以你永远不会进入第二个循环。您需要两个独立的线程并行运行。这些线程中的一个或两个可以/应该是计时器,但关键是它们是两个独立的线程。@CharlieArmstrong对,如果我没有说清楚,很抱歉。是的,我知道,物理学将在第二条线上。既然你已经是第二个建议计时器的人了,我来看看too@RichardBarker我不知道怎么做,但我想我在某种程度上利用GPU进行渲染,因为当我解锁FPS时(我在一个简单的演示中获得了600k),我的GPU直接达到了80%的使用率。我不会假装我知道它是如何工作的(我不知道),但它似乎是有效的,而且这是一个学校项目,所以我对它的进展非常满意。