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