游戏的帧率控制
我曾在不同场合,多次向人表达我对游戏程序设计的一个重要观点:时间控制,对于游戏程序设计至关重要。
这是因为,大多数电子游戏,都是一个实时人机互动系统。在非人机互动的软件中,软件及硬件一起是一个封闭系统,时间参数对这个系统是否正确工作是无意义的量。这样的系统,我们尽量应该设计成自动化工作模式,只要有正确的输入,得到正确的输出即可。通常,这样的系统的开发,还应该有自动化测试的流程去驱动它。
但实时人机互动软件则不一样,我们得把人看成系统的一部分。人和机器的交互是通过人眼、人耳、键盘、鼠标等完成信息交换的。如果把人脑看成一个线程、计算机看成另一个线程,我们几乎没有能力实现一个资源锁,利用锁的方式保证系统工作永远正常。人脑在全速运转时,适时得不到正确的信息输入,整个系统就可认为出现了故障。
可见,在这样的系统中,时间控制显得多么的重要。
当我们提到游戏的帧速率,我想把逻辑帧率与渲染帧率分开来处理。在这个问题上,或许许多游戏引擎的开发者并不赞同我的做法。但是,这毕竟是一个可以简化问题复杂度的方法,个人以为值得推广。
所谓逻辑帧率,就是游戏引擎每秒处理逻辑事件的频率。在我参与的游戏项目里,通常,我们都将逻辑帧率固定在一个固定值。为了方便直觉的构想,多数情况下,我倾向于方便十进制计算的数值。比如 100 fps 、50 fps 、25 fps 、20 fps 等等。
限定了逻辑帧率后,我们可以把人机交互系统中的机器剥离出来,成为一个独立系统,这样在测试和设计时,时间的要素被弱化了。游戏逻辑可以被严格限定在第整数个帧内发生。
通常,视频游戏软件的大量时间都消耗在渲染图象中。而逻辑处理在今天的计算机上,可以更容易的保持在一个高帧率,以提高拟真度。注意,这里所谓的逻辑处理,还包括了虚拟世界中的物理状态的模拟,对于简单的游戏,可能仅仅是对象的坐标;复杂的 3d 游戏或许就包括了物理引擎的运算。
对于渲染的问题。个人认为人脑处理信息允许在很短时间的内出现一点偏差,系统会自我纠正。那么只要计算机输出的信息的时刻不要差的太远即可。视觉,虽然作为最大信息量的通道,需要保持较高的通讯频率,但我们并不需要无限的高。渲染帧率高于逻辑帧率一般是没有什么意义的。
当很多人埋头一味的追求高的渲染帧率时,我们是不是应该停下来仔细想想,怎样可以用最节省的方式让大脑适应你的游戏画面。最终是你的大脑在判断画面是否流畅,而不是渲染帧率那个数值的高低。
相信大家都看过很多欺骗眼睛的图片,网络上已经有很多了。许多静止的图片会让人感觉在动。一些运动的图片,实际的动作跟像素级别上的变动不太一样。
简单说来,人脑接受和处理图象的速度有限。大脑在处理此刻视网膜上的图象的同时,还会对未来这些图象的变化有一个预期。当图象的运动满足这个预期时,我们会感觉很流畅很舒适;当和预期不符时,或者让我们头晕眼花,或者让我们产生错觉。(btw, 我忘记曾经在哪看过一副瀑布的 gif 动画,这组动画经过特别处理。当瀑布静止时,我们的眼睛会产生水向上倒流的感觉。)
所以,无论是 3d 游戏还是 2d 游戏。快速的移动镜头都是不提倡的。不光是游戏,电影中,我们也极少看见导演快速的移动镜头,大多数场景都是固定镜头拍摄的。
如果你非要移动镜头(比如让镜头跟随主人公),那么也尽量让移动速度表现的足够匀速。因为我们能达到的帧速率有限,快速移动镜头很难做到线性(无论是 2d 还是 3d 游戏都很难做到),大多数情况下,我们会在设计上放慢镜头的移动。
最后,谈一下镜头移动和渲染帧率的控制问题。
既然人脑总希望画面符合预期,我们在引擎呈现的时候,最关键的就是在最准确的时刻渲染出准确的一帧。如果我们一味的在系统空闲的时候渲染,往往会出现在很短时间段内,时快时慢,虽然快慢相差不多(可能只有 0.01 秒的差别),但也会影响到人脑的感觉。
一个简单的办法就是,把渲染帧率也锁死。比如锁定为和逻辑帧率相同,或为逻辑帧率的一半,1/3 等。在多任务操作系统环境中,这样可以让你的游戏跟别的应用程序良好的协同工作。当游戏尽量的把空闲时刻让出时,它也更容易的在准确的时刻渲染时期待的画面出来。
btw, 我们目前的引擎使用了一个简单的渲染帧率控制函数。侦测最近几秒的渲染情况,一旦发现过忙,则主动下调渲染帧率,让渲染可以均匀的进行;当系统比较空闲时,再上调渲染帧速率。实际运用下来,效果不错。
Comments
Posted by: facturi | (16) August 2, 2015 04:53 PM
Posted by: EndDuke | (15) January 6, 2010 09:57 AM
Posted by: Diehard | (14) May 6, 2008 09:52 PM
Posted by: xiaolige | (13) April 17, 2008 07:39 PM
Posted by: Jean | (12) April 17, 2008 01:13 PM
Posted by: 极光炫影 | (11) April 13, 2008 11:58 PM
Posted by: Joe | (10) April 13, 2008 08:25 PM
Posted by: Zhe | (9) April 12, 2008 11:46 PM
Posted by: zen_yue | (8) April 12, 2008 01:48 AM
Posted by: csut | (7) April 11, 2008 06:57 PM
Posted by: zen_yue | (6) April 11, 2008 02:44 PM
Posted by: 惊涛 | (5) April 11, 2008 11:52 AM
Posted by: xiaolige | (4) April 11, 2008 10:32 AM
Posted by: cat | (3) April 11, 2008 09:12 AM
Posted by: roby | (2) April 11, 2008 09:09 AM
Posted by: 不空 | (1) April 11, 2008 12:04 AM