Questions tagged «extrapolation»


2
插值实际上如何使物体的运动平滑?
在过去的8个月左右的时间里,我已经问过几个类似的问题,但并没有真正的高兴,所以我将使这个问题更笼统。 我有一个Android游戏,它是OpenGL ES 2.0。在其中,我有以下游戏循环: 我的循环以固定的时间步长原理工作(dt = 1 / ticksPerSecond) loops=0; while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){ updateLogic(dt); nextGameTick+=skipTicks; timeCorrection += (1000d/ticksPerSecond) % 1; nextGameTick+=timeCorrection; timeCorrection %=1; loops++; } render(); 我的整合是这样的: sprite.posX+=sprite.xVel*dt; sprite.posXDrawAt=sprite.posX*width; 现在,一切都按我的意愿运行。我可以指定我想要一个对象在2.5秒内移动一定距离(例如屏幕宽度),并且它会做到这一点。同样,由于我在游戏循环中允许跳帧,因此我几乎可以在任何设备上执行此操作,并且总是需要2.5秒。 问题 但是,问题在于,当渲染帧跳过时,图形停顿。太烦人了。如果我取消了跳帧的功能,那么一切都会很顺畅,但是会在不同设备上以不同的速度运行。所以这不是一个选择。 我仍然不确定为什么会跳帧,但是我想指出的是,这与性能差无关,我将代码恢复为1个小的sprite,没有任何逻辑(除了移动精灵),但我仍然跳过帧。这是在Google Nexus 10平板电脑上使用的(如上所述,我需要跳帧以保持设备间的速度保持一致)。 因此,我唯一的选择是使用插值法(或外推法),我读过那里的每篇文章,但是没有一篇文章真正地帮助我了解它的工作原理,并且所有尝试的实现都失败了。 使用一种方法,我可以使事情顺利进行,但是这是行不通的,因为它弄乱了我的碰撞。我可以预见任何类似方法都会出现相同的问题,因为插值在渲染时传递给了渲染方法(并在其中起作用)。因此,如果Collision纠正了位置(角色现在正站在墙旁边),则渲染器可以更改其位置并将其绘制在墙中。 所以我真的很困惑。人们曾经说过,永远不要在渲染方法中更改对象的位置,但是所有在线示例都显示了这一点。 因此,我要求朝着正确的方向发展,请不要链接到流行的游戏循环文章(deWitters,Fix your timestep等),因为我已多次阅读这些文章。我不是要任何人为我编写代码。请简单地解释一下插值实际上如何与一些示例一起使用。然后,我将尝试将任何想法整合到我的代码中,并在需要时提出更具体的问题。(我确信这是很多人都在努力解决的问题)。 编辑 一些其他信息-游戏循环中使用的变量。 private long nextGameTick …

2
外推打破碰撞检测
在对精灵的运动进行推断之前,我的碰撞效果非常好。但是,在对精灵的运动进行推断(以使物体平滑)之后,碰撞不再起作用。 这是外推之前的工作方式: 但是,在执行推断后,碰撞例程将中断。我假设这是因为它作用于外推例程(位于我的render调用中)产生的新坐标。 应用推断后 如何纠正这种行为? 我尝试在推断后再进行一次额外的碰撞检查-这似乎确实解决了许多问题,但是我将其排除在外是因为将逻辑放入渲染中是不可能的。 我还尝试制作了spritesX位置的副本,对其进行推断并使用该位置而不是原始位置进行绘制,从而保留了原始位置以供逻辑使用-这似乎是一个更好的选择,但仍然会产生一些奇怪的效果与墙壁碰撞时。我很确定这也不是解决此问题的正确方法。 我在这里找到了几个类似的问题,但是答案并没有帮助我。 这是我的推断代码: public void onDrawFrame(GL10 gl) { //Set/Re-set loop back to 0 to start counting again loops=0; while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){ SceneManager.getInstance().getCurrentScene().updateLogic(); nextGameTick+=skipTicks; timeCorrection += (1000d/ticksPerSecond) % 1; nextGameTick+=timeCorrection; timeCorrection %=1; loops++; tics++; } extrapolation = (float)(System.currentTimeMillis() + skipTicks - …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.