图形学思考 - FPS更新率的比喻

来源:互联网 发布:php fsockopen 异步 编辑:程序博客网 时间:2024/04/29 15:41

到了Directx 11,可以使用参数指定更新率了,比之前的Directx9就方便多了。

如:

DXGI_SWAP_CHAIN_DESC swcd;swcd.BufferDesc.RefreshRate.Numerator = 60;

但是我觉得还是需要懂得其中的基本原理的。


帧率为60FPS的意思就是每秒更新60帧,一帧就是指GPU画一个画面的图案。

可以这么比喻吧:

GPU相当于一个超级画家, CPU相当于这个超级画家的超级助手,画家每秒画了60幅画,还有时间展示出来给我们看,看完了还把看过的画擦掉,因为画家只有两幅画布(当然到了D3d11可以是3幅画布),展示给我们看一幅画同时擦掉另一幅画,然后画上新的图案,然后再展示给我们看,然后再擦去另一幅画,如此循环。

超级助手负责告诉画家,观众在那里,应该把画放在什么地方,应该画多大的尺寸等等。

好忙的画家啊。画家有多少时间做这样的一个循环呢?一秒等于1000毫秒,那么他有1000/60 == 16.666...毫秒完成并展示一幅画。


如果我们设置了是60FPS的更新率,但是测试结果显示我们的更新率没有到60FPS,或者是40多,或者是50多,甚至是20多FPS?

那就说明这些画的内容十分复杂,比如是“最后的晚餐”,那么画家就不能在16.66...毫秒内完成这幅画,这个时候就只能降低展览速度了。


如果画家可以以超过1秒60幅画的速度来完成,会发生什么事情呢?那么我们就可以命令画家和助手休息一下,或干点别的事情,使得其展览速度稳定。如果我们没有设置稳定更新率,那么画家和助手就会以全速来更新展览的。比如directx9,要稳定FPS就需要我们写额外的代码。就是在每帧更新完之后,发一个sleep指令,指定CPU休息多长时间,相当于每次画家画完了画之后,我们都会告诉画家先休息一下,等到了时间点再换下一幅画。


到此为止都很好理解,但是问题来了, 主要有:

1 画家(GPU)真的可以以如此快的速度更新吗?

2 为什么需要两幅画布来展示呢?或者为什么不能使用100幅画布来展示呢?

3 超级助手(CPU)好像都做“无用功”,他有用吗?画家和助手之间到底是怎么分工的?

等等问题,都不容易解答,这个时候就看读者的图形学功力了,功夫深的自然理解的更加深入。


出处:http://blog.csdn.net/kenden23/article/details/20286727


努力,加油,为昆明祈福,中国人民加油!


1 1
原创粉丝点击