游戏的刷新频率分析
首先大家用的显示器自身有一个刷新频率,这里假设为85Hz,且为800x600resolution
而一般的CRT显示器显示信息是靠电子束一行行的打出来的(从左向右,从上到下),
而两幀之间电子束要从右下方回到左上角,这段时间叫Vertical Blank Interval,
撕裂现象:
DirectX里最原始的显示方法,即一边写显示内存(front buffer)一边显示,由于两者间没有同步
显然显示的内容会让你冒一身冷汗。
但此时你的FPS(这里其实指的是数据的刷新频率)是最高的但是毫无意义,而真实的显示频率则为85Hz。
为了消除撕裂现象,我们必须要有同步,DirectX里的组合buffer模式 + flip(页面切换)提供了同步方案。
组合buffer-即front buffer + back buffer + 0-N个过渡 buffer
当N=0时:
即双缓冲结构,要保证数据的显示刷新率为85,就必须在一个Vertical Blank Interval的时间内把back buffer 更新完,因为在电子束开始读取数据扫描后back buffer已经成了front buffer,已经不可写。当
一个Vertical Blank Interval的时间 < 更新back buffer的时间 < 1/85秒
数据的显示频率为42.5Hz,其他类推。
N>=1的情况 to be continued
【游戏的刷新频率分析】当电子枪扫描完一屏后,需要从屏幕的右下角返回到左上角,这段时间叫verticalblankperiod。
假设我们用双缓冲进行渲染。
如果“等待垂直同步信号”,系统会在电子束从右下角回到左上角这段时间内交换前缓冲和后缓冲。
如果“不等待垂直同步信号”系统会随时交换主缓冲和后备缓冲发生,而不管电子束的位置。
“等待垂直同步信号”会比较慢(并且限置FPS为屏幕刷新率),但是显示效果很稳定,不会出现画面被“撕裂”的情况。
“不等待垂直同步信号”有时会出现画面被“撕裂”的情况(如果当电子束扫描到屏幕中间时,系统交换主缓冲和后备缓冲,则显示的图象是不正常的:图象的上半部分是上一帧的,下半部分是当前帧的)。