« 负反馈系统在模型动画控制中的应用 | 返回首页 | 招行的系统测试过吗? »

游戏的帧率控制

我曾在不同场合,多次向人表达我对游戏程序设计的一个重要观点:时间控制,对于游戏程序设计至关重要。

这是因为,大多数电子游戏,都是一个实时人机互动系统。在非人机互动的软件中,软件及硬件一起是一个封闭系统,时间参数对这个系统是否正确工作是无意义的量。这样的系统,我们尽量应该设计成自动化工作模式,只要有正确的输入,得到正确的输出即可。通常,这样的系统的开发,还应该有自动化测试的流程去驱动它。

但实时人机互动软件则不一样,我们得把人看成系统的一部分。人和机器的交互是通过人眼、人耳、键盘、鼠标等完成信息交换的。如果把人脑看成一个线程、计算机看成另一个线程,我们几乎没有能力实现一个资源锁,利用锁的方式保证系统工作永远正常。人脑在全速运转时,适时得不到正确的信息输入,整个系统就可认为出现了故障。

可见,在这样的系统中,时间控制显得多么的重要。


当我们提到游戏的帧速率,我想把逻辑帧率与渲染帧率分开来处理。在这个问题上,或许许多游戏引擎的开发者并不赞同我的做法。但是,这毕竟是一个可以简化问题复杂度的方法,个人以为值得推广。

所谓逻辑帧率,就是游戏引擎每秒处理逻辑事件的频率。在我参与的游戏项目里,通常,我们都将逻辑帧率固定在一个固定值。为了方便直觉的构想,多数情况下,我倾向于方便十进制计算的数值。比如 100 fps 、50 fps 、25 fps 、20 fps 等等。

限定了逻辑帧率后,我们可以把人机交互系统中的机器剥离出来,成为一个独立系统,这样在测试和设计时,时间的要素被弱化了。游戏逻辑可以被严格限定在第整数个帧内发生。

通常,视频游戏软件的大量时间都消耗在渲染图象中。而逻辑处理在今天的计算机上,可以更容易的保持在一个高帧率,以提高拟真度。注意,这里所谓的逻辑处理,还包括了虚拟世界中的物理状态的模拟,对于简单的游戏,可能仅仅是对象的坐标;复杂的 3d 游戏或许就包括了物理引擎的运算。

对于渲染的问题。个人认为人脑处理信息允许在很短时间的内出现一点偏差,系统会自我纠正。那么只要计算机输出的信息的时刻不要差的太远即可。视觉,虽然作为最大信息量的通道,需要保持较高的通讯频率,但我们并不需要无限的高。渲染帧率高于逻辑帧率一般是没有什么意义的。

当很多人埋头一味的追求高的渲染帧率时,我们是不是应该停下来仔细想想,怎样可以用最节省的方式让大脑适应你的游戏画面。最终是你的大脑在判断画面是否流畅,而不是渲染帧率那个数值的高低。

相信大家都看过很多欺骗眼睛的图片,网络上已经有很多了。许多静止的图片会让人感觉在动。一些运动的图片,实际的动作跟像素级别上的变动不太一样。

简单说来,人脑接受和处理图象的速度有限。大脑在处理此刻视网膜上的图象的同时,还会对未来这些图象的变化有一个预期。当图象的运动满足这个预期时,我们会感觉很流畅很舒适;当和预期不符时,或者让我们头晕眼花,或者让我们产生错觉。(btw, 我忘记曾经在哪看过一副瀑布的 gif 动画,这组动画经过特别处理。当瀑布静止时,我们的眼睛会产生水向上倒流的感觉。)

所以,无论是 3d 游戏还是 2d 游戏。快速的移动镜头都是不提倡的。不光是游戏,电影中,我们也极少看见导演快速的移动镜头,大多数场景都是固定镜头拍摄的。

如果你非要移动镜头(比如让镜头跟随主人公),那么也尽量让移动速度表现的足够匀速。因为我们能达到的帧速率有限,快速移动镜头很难做到线性(无论是 2d 还是 3d 游戏都很难做到),大多数情况下,我们会在设计上放慢镜头的移动。

最后,谈一下镜头移动和渲染帧率的控制问题。

既然人脑总希望画面符合预期,我们在引擎呈现的时候,最关键的就是在最准确的时刻渲染出准确的一帧。如果我们一味的在系统空闲的时候渲染,往往会出现在很短时间段内,时快时慢,虽然快慢相差不多(可能只有 0.01 秒的差别),但也会影响到人脑的感觉。

一个简单的办法就是,把渲染帧率也锁死。比如锁定为和逻辑帧率相同,或为逻辑帧率的一半,1/3 等。在多任务操作系统环境中,这样可以让你的游戏跟别的应用程序良好的协同工作。当游戏尽量的把空闲时刻让出时,它也更容易的在准确的时刻渲染时期待的画面出来。

btw, 我们目前的引擎使用了一个简单的渲染帧率控制函数。侦测最近几秒的渲染情况,一旦发现过忙,则主动下调渲染帧率,让渲染可以均匀的进行;当系统比较空闲时,再上调渲染帧速率。实际运用下来,效果不错。

Comments

实际上帧率不好控制,在我的PC上,即使是Sleep(1)也会消耗15至20毫秒的时间,这应该是因为CPU在不同线程之间切换造成的。而direct3D中若使用垂直同步,则每帧渲染完毕后就要等到显示器呈现完毕才开始绘制下一帧,这可以极其精准地把帧率控制在60,但如果把渲染和游戏帧率分开,游戏帧率太高会占CPU100%,游戏帧率为60会导致与渲染线程不同步,导致卡顿、跳跃
最后大哥提到了自动锁帧,(因为显卡,场景的复杂程度不同)。我们很难给定一个绝对的FPS, 所以只能用。一个简单的控制函数,但是对于某些显卡却绝对不乐观,相信云风大哥应该是看到过的。如果帧率下调,显卡空闲,马上系统空闲。帧率上调,显卡马上变得超级卡。这个阈值非常难找,用判断系统空闲的方法也就存在两个缺点,1系统空闲一段时间帧率才会上来。2上来以后发现系统繁忙,又会下调,帧率还是在不断浮动,不稳。不知云风大哥如何如何解决这个问题的呢。
如何实现要研究好久,所以容易继续沿用原先的一套路。毕竟给我们研究的时间不多,都是产品才催。。。
锁桢好啊,最讨厌那帮一跑就cpu100%的游戏,夏天玩他还担心俺的CPU呢!俺等梦幻西游私服n年了还没出来,管理代码真有一套!
《天龙八部》就是锁桢处理的,锁桢产生的一个好处就是不会把cpu占满,这对于玩游戏的时候还要做其他事情的玩家非常有帮助。 天龙的画面在移动的时候会产生让人不舒服的感觉,原因大概是因为它的视角是向下看的,而且场景色彩比较多,造成同一屏幕内有大量不连续的色彩同时移动,给人造成视觉上的眩晕,这中现象在视角比较类似的《大唐》中也同样存在
云风所提的逻辑帧率和渲染帧率分离的想法确实是一个好的想法,特别是对于那些配置相对较低的用户或者资源占用变态的游戏。逻辑帧率远高于渲染帧率的时候实时性体验会差点,反之相对较好,关键在于如何找一个平衡。或者,可以计入一个类似视频、音频压缩中类似关键帧评价的方式,不过这个评价似乎还是需要花点时间研究。
很多的时候是达不到理想的速度。 当然如果你可以做到1000+FPS。 那么已经不需要考虑什么了。 你想怎么做就怎么了。
电影是24fps。但是由于遮挡的关系,实际上人眼的感觉是48Hz,所以基本可以蒙混过关。电视50/60Hz也就是这样来的(NTSC才23.97fps) ps. OS X对应用程序都有个fps限制的 呃,这么做还可以顺便根据负载调整特效~
感觉最重要的是帧率的均匀,稳定在一数值,不只是渲染的帧率与逻辑帧率,还要使这些帧率适合人的习惯.上面云风说过人脑对运动有一定的预测性,这个预测性跟之前的运动轨迹与速率有关,在一定范围内的稳定帧率表现一个均匀分切了的运动会是人眼所适应的.
电影画面移动的速度是23fps,电影中无论怎么动态的场景,感觉都很流畅,这个速率已足够欺骗人眼了,实际上更快的速度人眼是根本无法分辨的。为什么要用更快的帧率呢?单幅电影画面通常被认为有几千万像素,当然远非一般电脑显示器可以企及,难道更快的帧率是为了弥补单幅画面分辨率的不足吗?提高帧率可以有这种效果?
强烈同意那个逻辑帧率的说法,之前也遇到类似的问题,感觉好多东西不是一味的高或低就好而是稳定在一个理想的值才是最重要的.控制游戏的逻辑运算时间,嗯,非常重要啊
狂同意云风兄的观点,不考虑时间因素的计算机系统不是好系统. 不过,理想状态是,计算机的处理/存储能力无限,到那时,就不用再为时间因素烦恼了. 提高计算机系统的处理/存储能力才是第一要务啊!
最近玩天龙八部,发现角色跑路时比其他游戏闪得厉害,请问云风大哥这是不是onidle渲染得原因呢?
>大多数电子游戏,都是一个实时人机互动系统. 这个系统是什么样的?
这个想法的确很好的. 现在很多时候,我都为时间的不精确而犯愁.因为我只能使用渲染帧率.这样在某些功能实现的时候都很郁闷的说. 问题解决方法可以借鉴.接着学习.谢谢.
我在玩3D游戏时候,如果是在空旷的场景还好,如果是在屋子里转来转去的话,一会儿就会感到恶心……

Post a comment

非这个主题相关的留言请到:留言本