为啥动画有时会根据经过的时间使用步骤来完成?

Posted

技术标签:

【中文标题】为啥动画有时会根据经过的时间使用步骤来完成?【英文标题】:Why are animations sometimes done using steps based on the amount of time that's passed?为什么动画有时会根据经过的时间使用步骤来完成? 【发布时间】:2011-01-01 20:26:07 【问题描述】:

我注意到一些程序员会根据时间差异为对象设置动画。我不确定为什么或者即使这是合乎逻辑的。有谁知道其中的意义?

下面是一段解释我的意思的sn-p代码:

var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
var newBallX = ball.x + ballDX*timePassed;
var newBallY = ball.y + ballDY*timePassed;

【问题讨论】:

查看这个帖子:***.com/questions/1284886/… 【参考方案1】:

当您根据时间制作动画时,您可以让自己独立于帧速率。无论经过多少帧,您的球都会在给定的时间内移动相同的距离。将其与取决于帧速率进行比较,后者取决于许多变量,例如可用于制作动画的处理能力。

这是一个常见的游戏物理问题——请查看 Glenn Fiedler 出色的 "Fix Your Timestep!" article 了解更多详细信息。 (正确操作比将方向向量乘以时间步长稍微复杂一些。)

【讨论】:

如果您曾经看过正在运行的 SWF 的帧速率,您就会完全理解 John 回答的必要性 :)【参考方案2】:

为什么不这样做呢?相对于做什么?是简单的直线运动吧?这里有一个想法:这允许球在其他程序减慢计算机速度的情况下赶上它的预期位置。

【讨论】:

【参考方案3】:

现代计算机操作系统一次运行许多任务,您并不总是定期获得时间片。通过使用实时时钟的差异,您可以平滑运动,而不是每次通过循环移动相同的量,如果操作系统在返回之前给另一个进程多几毫秒的时间,这可能会导致它看起来很不稳定给你的。

【讨论】:

【参考方案4】:

逻辑很简单。

BallDX => Ball Delta X => 球在一秒内可以在 x 坐标上移动的距离

timepassed => 经过的时间

if OldBallX = 0
if BallDX = 10
if TimePassed = 1 sec
Then NewBallX = OldBallX + (BallDX*TimePassed)

这意味着

NewBallX = 0 + (10 * 1) = 10 pixels

这样的话

if TimePassed = 0.5 sec (half a second)

然后

NewBallX = 0 + (10 * 0.5) = 5 pixels 

逻辑?

【讨论】:

【参考方案5】:

独立于帧率的最重要方面是您不必将帧率链接下来。过去,在黑暗时代,编写游戏时会尽可能多地使用 CPU,帧速率由 CPU 速度决定。我记得在我的 16MHz 机器上玩过游戏,因为它们是为 1MHz 机器编写的,所以事情飞得如此之快,以至于你无法做出反应。程序员意识到这一点并开始编写限制帧率的游戏,早期通常为 30fps,后来为 60fps(通常锁定到显示器的 VSYNC)。这解决了问题,但对于我们这些拥有想要更流畅运动的出色计算机的人来说真的很烦人。最终,他们开始编写完全独立于帧率的游戏,这使您可以以 700 fps 玩游戏并获得与 20 fps 相同的体验,除了更流畅的图形。正如其他人所说,它还可以应对游戏过程中的负载变化,这对于当今的多任务操作系统来说非常重要。

【讨论】:

【参考方案6】:

如果您将动画制作为时间的函数,您可以在某种程度上独立于帧速率,这意味着如果您将动画制作为 24fps,您可以轻松调整 strong> 适合 30 fps 场景的动画如果它是动态的(如由函数定义/反对逐帧绘图就是一切)

这是一个短篇小说,完整的解释请查看 Robert Penner 在Motion, Tweening and Easing 上的精彩章节。

【讨论】:

以上是关于为啥动画有时会根据经过的时间使用步骤来完成?的主要内容,如果未能解决你的问题,请参考以下文章

使用二进制来表示步骤完成进度

如何把谷歌地图动画转换为视频文件

为啥相同的 css 动画有时会不正确?

CSS动画/过渡旋转标志(步骤)

如何查找CAD建筑图纸中的图形数量

为啥eclipse加载不了jar包