【问题标题】:Java Splitting Up Work Between FramesJava 在帧之间拆分工作
【发布时间】:2018-02-02 21:02:40
【问题描述】:

首先我会解释我想要做什么,然后我会提供一个建议的解决方案。

问题

我正在运行一个游戏,我希望每帧都做一定量的工作。例如,我有 N 个对象在队列中等待初始化(想象初始化是一个相当昂贵的操作,N 很大),将它们全部添加后,我想创建它们的碰撞盒,然后,我想将它们合并在一起以限制渲染调用。我不能在不同的线程上执行这些操作,因为所有这些东西都与游戏世界密切相关。但是我想将所有这些操作分成小块来运行每一帧,以便最小化延迟(帧率下降)。我该怎么做呢?

建议的解决方案

如果有一个函数可以在一次调用后停止并在再次调用后从中断处继续:

例如,

boolean loadEverything() {
    for (int i = 0; i < objectsToAdd.length; i++) {
        world.add(objectsToAdd[i]);
        if (i % 10 == 0) {
            return stop();
        }         
    }

    makeCollision();
    return stop();

    mergeObjects();

    return true;
}

调用loadEverything() the first objectsToAdd/10 次,一次将 10 个对象添加到游戏世界。然后调用它应该运行makeCollision() 然后停止。再次调用它运行mergeObjects(),然后函数返回true。在调用者函数中,我会运行 loadEverything() 直到它返回 true。

我知道存在类似here 描述的 yield-return、yield-break 实现,但我想知道它们是否有更通用的实现,或者可能存在不需要的更好的解决方案任何额外的依赖项。

【问题讨论】:

    标签: java methods libgdx


    【解决方案1】:

    你看协程了吗?有原生的 implementation in Kotlin,但在 Java 中有选项 herehere

    无论如何,我们需要确保那些需要在主线程中的 OpenGL 或 Box2D 操作应该在主线程中,因为我相信协程将在新线程下创建。因此,为此类操作拆分工作可能不会有任何好处。

    另一种选择

    您说在运行时创建对象时需要拆分工作。你能预先预测或估计你想要的物体数量吗?因此,如果您真的不需要像这样动态创建对象,我建议您查看 libgdx 中的对象池(请参阅更多 here)。该链接有在您的游戏中使用 Pool 的工作示例。

    这样的池已经有初始化的对象准备好被抓取和按需使用,如果需要在运行时也可以增长,所以最初如果你能提供一个你打算使用的对象数量的良好估计,这一切都很好。

    【讨论】:

      【解决方案2】:

      你为什么不添加一个静态变量来在函数调用之间保持它的值?然后你可以从当前值循环到当前值 + 10,将当前值(那个静态变量)增加 10 并退出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        相关资源
        最近更新 更多