【什么是FrameBuffer】 FrameBuffer直譯就是,幀緩沖。 Frame幀:你所看到的屏幕的圖像,或者在一個窗口中的圖像,就叫一幀。 Buffer緩沖:一段RAM,用來暫存圖像數(shù)據(jù),這些數(shù)據(jù)會被直接寫入到顯示設(shè)備。 幀緩沖就相當于介于 圖形操作 和 圖像輸出中間的一個中間人。將程序?qū)D形數(shù)據(jù)的處理操作,反饋到顯示輸出上。 顯卡(顯存中的數(shù)據(jù)) <-> 幀緩沖(程序?qū)ζ渲械臄?shù)據(jù)進行處理) <-> 顯示器(輸出圖像) 幀緩沖可用于,實現(xiàn)原先視頻卡并不支持的分辨率。 顯卡可能并不支持你當前某個更大分辨率的顯示器,但是可以通過幀緩沖獲取顯卡的顯存中的數(shù)據(jù),處理之后,實現(xiàn)更大的分辨率的圖像,然后將數(shù)據(jù)直接輸出到顯示器上。 【雙顯示器例子】 一個例子,可能就是雙顯示,最近剛剛看到實際某開發(fā)者的系統(tǒng),就是兩個顯示器,鼠標移動超過單個顯示器,到最右邊的時候,就跑到另一個顯示器了。對于常常用多系統(tǒng)或者需要打開很多東西的開發(fā)人員,這個功能很實用。 幀緩沖可以用于 頁面交換page flipping(也常叫做 雙緩沖double buffering),許多游戲都是采用此技術(shù),以實現(xiàn)更流暢的視頻輸出,以便用戶獲得更好的游戲體驗。此技術(shù)也被用于3D圖形加速。 【雙緩沖的主要實現(xiàn)原理】 假如你的顯示器是VGA模式,640×400,也就是虛擬的分辨率是640X800,也就是800線(每一行的數(shù)據(jù),稱為一條線,也就是640X1 的數(shù)據(jù)了)。800線的數(shù)據(jù)存儲于Framebuffer,而實際的顯示內(nèi)容,只是400線,Linux內(nèi)核中的Framebuffer模型中,對應(yīng)有個變量yoffset,就是表示的這個具體的縱坐標,默認是0,所以顯示的內(nèi)容就是,0-399線,由于和實際顯示頁面大小等同,所以此處可以簡稱為第一幀。如果yoffset改變了,比如此例中變?yōu)?00,那就是顯示剩余的部分,400-799線。此處簡稱為第二幀。 在系統(tǒng)顯示第一幀的時候,系統(tǒng)在后臺悄悄地準備第二幀的數(shù)據(jù),所以,等第一幀顯示完成,多數(shù)時候,第二幀的數(shù)據(jù)也準備好了,就可以直接顯示,同時系統(tǒng)又在準備接下來的一幀的數(shù)據(jù),這樣就可以大大提高顯示效率。 【平滑地滾動頁面的實現(xiàn)原理】 同上,在顯示完第一幀數(shù)據(jù)的時候,也就是0-399線的時候,將yoffset設(shè)置為1,就可以顯示1-400線的數(shù)據(jù)了,顯示完成后,再設(shè)置 yoffset為2,就顯示2-401線的數(shù)據(jù),這樣,就可以一點點地,平滑地顯示整個滾動畫面了。其實也就是畫面在垂直方向的滾動。其中yoffset 的增加,可以使用定時器,各個一段時間,比如10us,增加1,系統(tǒng)自動會更新顯示對應(yīng)的內(nèi)容,這樣我們所看到的內(nèi)容就是滾動的畫面了。 此外,Linux中的Framebuffer模型中,提供了一些ioctl功能,給定一些參數(shù),然后系統(tǒng)可以實現(xiàn)對應(yīng)的功能,其中有個參數(shù)就是FBIOPAN_DISPLAY。具體也就是類似如下調(diào)用: ioctl (framebuffer_handler, FBIOPAN_DISPLAY, &variable_info); 也就是說,如果顯卡/顯示屏控制器不支持雙緩沖,那么yoffset就應(yīng)該一直為0,并且在運行時候,也不應(yīng)該改變,也不應(yīng)該去給FBIOPAN_DISPLAY的參數(shù)調(diào)用ioctl。
|
|