想到哪写道哪——电子游戏的时间序列

在过去我一直看着各种时间序列,比如电影,比如游戏,不过我从未思考过时间到底有多短或者多长,即便这一感受是主观的,但我们也需要一些相对客观的讨论基础来进行交流,自转亦或者公转就是这种尺度,介于这种情况,我将会在文中使用秒等表示时间的量词,这些量词充斥在我们的环境中,以至于他们某种程度是客观的,即便某个机器中的“一秒”可能不是“铯133原子基态的两个超精细能阶之间跃迁时所辐射的电磁波的周期的9,192,631,770倍 的时间”,但它依然可以表示一个较短的时间。
一秒很长吗?人对时间的感知受到身体机能的影响甚大,年轻人与老年人对相同间隔时间估计有显著差距,在紧张的状态下时间流速极慢,而注意力高度集中时,却又飞速流逝。

电子游戏中的时间来源于计算机,计算机通过晶体振荡器来计算时间间隔,而电子游戏的更新实际上是以帧为单位进行的(逻辑与渲染根据需要可能采用不同的更新频率)。倒过来说时间的最小间隔是被帧所决定的,那么确定一个游戏的帧率就变得有必要了,帧数过低则每两帧之间的时间间隔变大,反之时间变小,如果我们追求精确则帧数自然是越高越好,反之回合制游戏的逻辑可以不依赖时间,对帧数要求也很低。
这很容易想到一个问题那就是,如果帧数很低,窗口期会错过去吗?答案是是的,帧数低的情况下连正常输入都会有问题,就更不用说QTE之类的了。
另一个问题,最快能有多快?

在上面这个视频中,50s的时候up主极快地拉动镜头,加上敌人反方向移动,最终使得敌人视野中只存在了几帧,如果仔细观察能发现这个过程中敌人的动画几乎都没有发生改变。
事实上,电子游戏与所有计算机视觉产物一样,是有限的,但人感知系统令这种有限能够成为一种连续。

确定底线变得非常重要。一般说30FPS能够让人感到连续,60FPS感到流畅,再往上可以更加丝滑,但这都建立在源头是无限(相对)的情况下,才能够满足不断上升的帧数,比如3D动画通过插值获得关键帧之间的运动,虽然关键帧是有限的,但插值函数是几乎无限的,总能获得一个数值,虽然变化可能过小以至于无法察觉。
但是2D序列帧动画往往由有限的动作组成,而到目前为止在游戏中还没有什么比较好的插值方法,也就是说如果制作标准是某个动作持***,画了10帧,那么无论游戏运行是30FPS还是60FPS效果不会有区别。
也就是说制作的标准除了考虑游戏帧数,也要考虑类型。

再回到移动的事情上,在什么情况下会出现瞬移?网络丢包的时候人物会瞬移,原因是渲染帧差距过大,物体在两个不同的画面之间行进了过远的距离。有意思的是这一过远距离不是游戏世界中的距离,而是屏幕上的距离,说到底游戏中只有比例(不考虑数据类型精度问题的情况下)。
反过来思考,一个游戏所能容忍的最高移动速度如何确定?(不考虑加载问题)前段提到了屏幕上的距离,那么这一速度也应该用屏幕空间速度来考量。

这些⚪都是等间距分布的,区别在于本身的半径不同,显然最小的⚪之间的空隙最大,距离我们理想的一条直线的效果最远。也就是说在屏幕上越小的东西,其屏幕空间最大移动速度应当越小。
根据奈奎斯特定理,采样频率大于信号最高频率两倍时采样后才能完整保留原信号的信息,当然这个规律是针对更加抽象的信号传输,对于视觉感受有一些冗余。
另外是烟雾、火焰等效果,在实时渲染中基本只能以序列帧+粒子变换的形式实现,序列帧的问题之前提过了,有许多类似的效果只需要少数甚至一个纹理就能实现较好的效果。(参考:Technical Artist Bootcamp: The VFX of Diablo)

说完了无插值有限序列的问题,再来提一下插值有限序列。
这一类序列的代表就是关键帧动画,文件只记录了其中几个关键帧的数据,中间的过程通过函数插值得到。这里的插值是以渲染帧为单位进行的,就像之前所说的,如果帧间隔物体移动距离过大就会出现瞬移的感觉,解决方法包括动作模糊等“糊弄”办法。
值得一提的是被称为smear的动画方法。

画面中同时出现了多手多脚,但人的知觉却将其作为一个连续变换的一部分,这是一种利用知觉系统缺陷或者说优势的优秀方法。

写了这么多总该有个总结,第一点人对时间的感知是很细密的,很多零点几秒的动作都能看清,但是零点零几秒都不行了。

第二点,录制与播放设备的能力往往是有限,必须要考虑游戏的目标帧数从而确定最小时间间隔和最大速度。

第三点,人的知觉系统很擅长脑补,所以只需要给一些“台阶”就能把姿态转换的过程脑补出来。
