Articles of 固定时间步长

从FPS计算TimeStep

如果我们每秒收集一次游戏的fps ,并将它们收集n秒,那么我们的收集中就有n个fps值。 那么我们可以从该集合中获得平均fps,例如: fpsCollection =[60.0,45.4,58.9.23.4,…,nth one] // assume max fps of game is 60 avgFps =(Sum of fpsCollection)/n 因此,我们如何计算avgFps的averageTime 时间步 长 ?

解释外推和内插的区别

http://www.unagames.com/blog/daniele/2010/06/fixed-time-step-implementation-box2d这里有两种在固定时间步骤物理模拟的情况下平滑的algorithm。 我不明白插值的公式: state = currentState * alpha + previousState * (1-alpha) 而且我也不了解比较的数字。 请解释什么是乘以current state与alpha和与previous state与1 – alpha求和。

跟踪游戏中的最佳时间是什么?

我正在接近发展中的一部分,我注意到时机将成为一个问题。 如果我将运动更新放在绘制场景的相同function中,那么较低的FPS意味着较慢的运动,较高的FPS意味着运动速度非常快。 但是,把它放在自己的function上,每1/60秒都会有问题。 我开始意识到,你不可能依靠一个预定的函数来跟踪时间。 这太不可靠了。 但是我仍然需要能够以相同的速度移动,而不管计算机可以处理的FPS。 那么跟踪时间和移动的最好方法是什么?

使用固定的时间步长和插值状态使得物理落后于一帧。 这会影响响应能力吗?

标题说明了这一切,但让我更深入地探讨这个问题: 我想现在每个人都知道Fix Your Timestep文章,以及从渲染步骤中释放物理引擎步骤的建议。 您可以通过累积渲染器生成的时间并以固定的步长消耗它来完成。 有趣的部分是,格伦Fiedler告诉你插入之前和当前的框架,这导致我以下问题: 这样做会使渲染滞后于物理背后的一帧。 这不会影响我的input响应? 因为我会多一个框架来看看我的行动的结果。 人们可能会倾向于说,一个框架并没有太大的区别,但是Activision的创始人之一,“托尼·霍克的专业溜冰者”系列的前程序员Mick West的这三篇文章却说: 推button 测量游戏中的响应度 编程响应 所以再一次,这个问题: 插入前一帧和当前帧,将使我滞后一帧。 这会伤害我的input响应吗?

Box2d固定时间步长和插值

我正在使用libGDX和我有问题实施box2d固定时间步与插值。 这是我的代码: private void updateWorld() { accumulator += Gdx.graphics.getDeltaTime(); while (accumulator>= step) { // The step is 1/10 copyCurrentPosition(); world.step(step, 8, 3); accumulator -= step; } interpolate(accumulator / step); } private void copyCurrentPosition() { prevPosition = new Vector2(player.body.getPosition().x, player.body.getPosition().y); } private void interpolate(float alpha) { player.body.setTransform(player.body.getPosition().x * alpha + prevPosition.x * (1.0f – alpha), player.body.getPosition().y […]

更新循环中的定时器应该有多精确?

固定游戏更新循环的计时器中“足够精确”的建议是什么? 目前我正在testing这个代码,但它有时候会错过1-2个更新@ 50hz。 而在30时,它似乎工作完美。 60HZ再差50HZ。 这是因为我的定时器分辨率太低了吗? 有什么我失踪?

固定时间步颤动

我已经看到了很多关于这个问题的问题,但是真的没有办法解决。 希望我能够解释这个问题,以便我能够解决这个问题。 我正在使用固定时间步骤基于在这里find的代码: 关于游戏/修复您的时间步! ,并用这种方法,我正在使用accumulator值来弥补帧速率的任何减速或加速。 通常帧之间的时间在15.5和17.5毫秒之间(固定速率的目标是1000/60帧/秒)。 结果发生的是这样的: 那个绿色图表显示累加器。 一旦累加器超过1000/60 fps,这就吓倒了。 此时可以看到,由于刷新率(15.5-17.5)之间的差异,有时累加器高于或低于16.66666666的阈值,直到它最终达到累加器太大而不能被下一帧的方差。 如果我简单地忽略刷新频率,并假设一个60fps的常数,那么扑动永远不会发生,所以它不应该是一个vsync问题(对吧?),这不是GC踢入。这是这部分代码的问题: accumulator += frameTime; while ( accumulator >= dt ) { update_logic(); accumulator -= dt; } 我意识到这个问题是当累加器达到0时,它实际上开始进行双重更新,并跳过一段时间的更新,导致颤抖/口吃的样子。 我很可能只是不了解累加器是如何工作的,或者屏幕刷新的差异太大,以至于无法正常工作。 提前致谢! 更新 这是一个输出日志的屏幕截图,显示了frameTime中的差异如何导致更新调用翻倍和跳过。 红色的项目是当累加器永远不会达到16.66666666 … 暂时我通过不让累加器低于frameTime的方差来“解决”这个问题,但是这不是一个真正的答案,只是一个补丁。 if(accumulator < 1){ accumulator = 1.5; } 也许这一点将有助于解释。 如果你启动累加器为0,第一帧需要15.89999ms,我们不更新任何东西,如果下一帧是17.55555ms,我们现在有(〜33.44ms),所以它更新两次。 frameTime中的方差越大,问题越严重。 我已经注意到这个问题很多人,通常谈话结束时没有公布的解决scheme,它会“消失”或线程死亡。

简单的速度减速与可变的时间步?

当你使用一个固定的时间步,你可以调用速度=速度* 0.95来模拟速度减速的一个简单的方法。 我想用可变的时间步骤做同样的事情。 我希望有一个简单的函数速度= f(速度,dt); dt是自上一帧以来的时间步长。

什么是实时使用?

我知道使用实时框架(平均而言应该在16-17ms之间变化)由很多框架提供。 GetTimeElapsedSinceLastFrame ,它给你挂钟时间。 但是我们应该在基本的物理模拟中使用这些信息吗 它看起来是一个坏主意。 说机器有一点点滞后,不管是什么原因(比如病毒扫描程序启动)。 所有的计算都跳转了,而且没有必要这样做 。 为什么不使用虚拟的秒钟,并忽略挂钟时间? 对于基恩指挥官的水平上的游戏,你不应该总是使用虚拟的第二个而不是实时的? (除了赛车比赛的秒表计时),我不觉得有必要使用实时,而不是固定的16ms时间步。

使用插值和舍入绘制位置固定时间步长:角色不移动时的生涩animation

我从这里实现了一个确定性的,固定的时间步长系统: http : //gafferongames.com/game-physics/fix-your-timestep/ 一切正常,输出与每一步都是一样的,但有一个问题 – animation是生涩,而角色不移动。 这里是负责插值的代码: draw.x = previous.getX() * alpha + current.getX() * (1.0f – alpha); draw.y = previous.getY() * alpha + current.getY() * (1.0f – alpha); g2d.drawImage(image, (int)draw.x, (int) draw.y, null); 以下是“alpha”的样子: 0.29991353 0.35988057 0.41996205 0.41996205 0.4799291 0.4799291 0.53989613 0.5998632 0.5998632 0.65994465 0.7199117 0.97999954 0.039999668 0.099999785 0.1599999 0.21999958 0.2799997 0.33999982 0.39999995 […]