我正在学习 Libgdx 并且有一些关于在渲染方法期间更新我的游戏逻辑的问题。
理想情况下,我希望将我的游戏逻辑和渲染分开。这样做的原因是,如果我在系统上具有高 FPS,我的游戏循环会“运行”得更快。
我正在寻找的是保持体验不变并可能限制我的更新..如果有人可以向我指出如何a)通过 DeltaTime 限制我的渲染更新 b)通过 Deltatime 限制我的游戏逻辑更新的教程。
谢谢 :)
重新阅读您的问题后,我认为您缺少的技巧(基于您的评论,即在更高刷新率的系统上运行会导致您的游戏逻辑运行得更快),是您实际上根据“delta " 渲染的时间。Andrei Bârsan 在上面提到了这一点,但我想我会详细说明一下如何使用 delta。
例如,在我的游戏的 render() 中,我首先调用我的 entityUpdate(delta),它更新和移动游戏中的所有对象,按时间“delta”移动的距离缩放(它不渲染它们,只是移动它们的位置变量)。然后我调用 entityManageCollisions(delta),它解决了由更新引起的所有冲突,最后我调用 entityDraw(batch, delta),它使用 delta 获取精灵动画的正确帧,并实际在屏幕上绘制所有内容。
我使用实体/组件/系统模型的变体,因此我一般处理我的所有实体,并且我上面提到的那些方法调用本质上是“系统”,它们作用于具有某些组件组合的实体。
因此,总而言之,将 delta(传递给 render() 的参数)传递到您的所有逻辑中,这样您就可以根据自上次调用以来经过的时间量来缩放事物(将实体移动适当的距离)。这要求您根据实体的单位/秒设置速度,因为您正在传递一个值来缩放它们,只需几分之一秒。一旦你做了几次,并试验了结果,你就会处于良好的状态。
另请注意:这将使您在交互式调试会话中发疯,因为增量计时器自上次渲染调用以来一直在累积时间,导致您的实体飞过整个屏幕(并超出 - 为您测试这些边界!)因为它们通常获得亚秒级更新,但最终可能会超过 30 秒(或者无论您花多长时间查看单步调试器的内容),所以在我的渲染()的最顶部,我有一行说delta = 0.016036086f;
(该数字是来自我的开发工作站的样本 detla,并且似乎给出了不错的结果 - 您可以通过在测试运行期间将其写入控制台来捕获视频系统的典型增量,并使用该值代替,如果您喜欢) 我对要部署的构建进行注释,但在调试时未注释,因此每一帧都会将游戏向前移动一个一致的量,无论我在调试器中花费多长时间查看事物。
祝你好运!
到目前为止的答案是没有使用并行线程 - 我过去自己也有过这个问题,并且有人建议我不要使用它 -链接。一个好主意是首先运行世界更新,然后如果帧中没有足够的时间来进行渲染,则跳过渲染。尽管如此,应该使用增量时间来保持一切顺利并防止滞后。
如果使用这种方法,明智的做法是防止发生超过 X 次连续跳帧,因为在(不太可能,但可能,取决于与渲染相比有多少更新逻辑)的情况下,更新逻辑持续时间超过为一帧分配的总时间,这可能意味着您的渲染永远不会发生 - 这不是您想要的。通过限制您跳过的帧数,您可以确保更新可以顺利运行,但您也可以保证当有太多逻辑需要处理时游戏不会死机。