首先,我将解释我想要做什么,之后我会提供一个建议的解决方案。
我正在运行一个游戏,我希望每一帧都能完成一定数量的工作。例如,我有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()
第一个objectsToAdd / 10次,一次向游戏世界添加10个对象。之后调用它应该运行makeCollision()
然后停止。再次调用它会运行mergeObjects()
,然后该函数返回true。在调用函数中,我将运行loadEverything()
,直到它返回true。
我知道有类似于here描述的那些回归,收益率突破的实现,但我想知道是否有更普遍的实现,或者可能存在一个不需要任何额外依赖关系的更好的解决方案。
答案 0 :(得分:0)
你看看Coroutine了吗?有本地implementation in Kotlin,但在Java中有选项here和here。
无论如何,我们需要确保那些需要在主线程中的OpenGL或Box2D操作应该在主线程中,因为我相信coroutine将在新线程下创建。因此,对于那些操作来说,拆分工作可能没有收获。
另一个选项
您说您需要在运行时分割创建对象的工作。你能预测或估计你想要的物体数量吗?所以如果你真的不需要动态创建这样的对象,我建议你看一下libgdx中的Object Pool(参见更多here)。该链接具有在游戏中使用Pool的实例。
这样的Pool已经初始化了对象,可以按需抓取和使用,如果需要在运行时也可以增长,所以最初如果你可以提供一个很好的估计你打算使用的对象数量,那么它就可以了。一切都很好。
答案 1 :(得分:0)
为什么不添加一个静态变量来保持它在函数调用之间的值?然后你可以从当前值循环到当前值+ 10,将当前值(该静态变量)增加10并退出。