幀緩衝器

幀緩衝器是一個視頻輸出設備,它從一個包含了完整幀數據的內存緩衝區驅動視頻顯示器。

昇陽TGX影格緩衝區

內存緩衝區中的信息通常包含屏幕上每個像素的色彩值,色彩值常以1位、4位、8位、16位及 24位真彩色格式存儲。有時還有一個alpha通道來保存像素的透明度。驅動幀緩衝器所需的總內存量取決於輸出信號的分辨率色彩深度和調色板大小。

向量顯示器比幀緩衝器出現得早,二者有很大的不同。使用向量顯示器時,只存儲了圖元(graphics primitives)的頂點。輸出顯示器的電子束按命令從一個頂點移動到另一個頂點,在這些點之間形成一個模擬的線條。而使用幀緩衝器時,電子束(如果顯示技術使用了電子束)按命令在整個屏幕上從左到右、從上到下描繪(trace),也就是電視機呈現廣播信號的方式。與此同時,屏幕上每個點的色彩信息從幀緩衝器中取出,形成一系列離散的像素

顯示模式

個人和家用計算機中的幀緩衝器中常有一些定義好的模式,也就是幀緩衝器可以工作的模式。這些模式可以自動配置硬件以輸出不同的分辨率、色彩深度、內存布局及刷新頻率英語Refresh rate等。

Unix中則通常沒有這些便利,而是更傾向於直接操縱硬件。這可以更靈活地設置可以使用的分辨率、色彩深度和刷新頻率,只受限於可用作幀緩衝器的內存。這種方法的一個副作用是,顯示設備可能被迫工作在其力不能及的模式下,有時這會導致設備器硬件上的損壞。不過更常見的是,它會產生一些垃圾而無用的輸出。現代的CRT顯示器通過引入智能保護電路而解決了這一問題。如果被設置成了不可用的顯示模式,則會顯示出錯誤信息。

LCD也會含有這樣一個保護電路,但並不是出於這個原因。由於LCD必須以數字形式採樣顯示信號(這樣來模擬電子束),所以超出範圍的信號無法物理地顯示在監視器上。

調色板

傳統的幀緩衝器支持的色彩模式很廣泛。受限於昂貴的內存,大多數早期的幀緩衝器使用的是1位、2位、4位或 8位的色深。小的色深導致不能產生完整的色彩範圍。其解決方法是為幀緩衝器增加一個查找表(lookup table,LUT),把幀緩衝器中存儲的每個「顏色」作為一個索引。這就是所謂的索引色(indexed color)模式。

查找表扮演着調色板的角色,它包含的數據用以定義數量有限的——比如256種——色彩。但這256種色彩中的每種色彩本身,則是可能是用許多位(比如24b,每8位對應於三原色中的一色)定義的。有了24位,色彩就可以定義得更精細了。色彩總數有限的圖像總還有些捉襟見肘,不過它們可以被精挑細選出來,故仍被認為比直接使用8位色略勝一疇。

在索引色模式下,幀緩衝器中存儲的數據決定了調色板中256種色彩中的哪一種將用於當前像素,然後查找表中存儲的數據被送往3個數-模轉換器,這樣來為顯示器創建視頻信號。

在有些設計中,也可以臨時向查找表中寫入數據或在已有調色板中切換,也允許把圖像分割成一個個水平條,每個水平條使用自己的調色板,這樣就可以呈現調色板範圍更廣的圖像了。

內存訪問

幀緩衝器通常是以直接映射到CPU內存空間的方式訪問的,但這並不是唯一的方法。比如:

  • 把整個幀緩衝器映射到一個給定的內存範圍;
  • 通過操作對應端口直接控制像素點或者色塊;
  • 把幀緩衝器映射到一個比它小的內存範圍內,必要時進行內存庫切換(bank switching)。

虛擬幀緩衝器

許多系統嘗試模擬幀緩衝器設備的功能,通常是出於兼容性的考慮。兩個最常見的虛擬幀緩衝器是Linux的fbdev及X Window的Xvfb。Linux的fbdev把對訪問底層幀緩衝器的物理方式抽象成一個可靠的內存映射,以易於程序訪問。這樣增加了移植性,因為程序無須應對內存映射不連續的系統或要求內存庫切換(bank switching)了。

X Window System中添加Xvfb是為了在沒有圖形幀緩衝器時運行X,最初的原因已不可考,而在現代系統中它常被用以支持JVM之類的程序,這些程序不允許在無界面環境中產生動態圖形。

畫面交換

由於幀緩衝器通常是為處理多個分辨率而設計的,故其內存也通常比以低分辨率顯示單幀所需要的內存大。由於內存的大小相當可觀,故可以在不妨礙當前所顯示幀的前提下向視頻內存中寫入新幀。這是通過告訴幀緩衝器為當前幀使用某一部分特定內存來實現的。這一部分的內存內容正在顯示時,另一部分完全獨立的內存被填充為下一幀的數據。一旦從緩衝區(通常稱為「後端緩衝區」)被填充,幀緩衝器就被要求查看從緩衝區。此時主緩衝區(通常稱為「前端緩衝區」)變成從緩衝區,從緩衝區則變成了主緩衝區。這一交換通常在垂直遮沒間隔中完成,以避免屏幕被「撕裂」(即顯示一半舊幀、一半新幀)。

現代多數幀緩衝器都有足夠多的內存,以執行主從緩衝區的交換——即使是在高分辨率下。這樣,它就成了PC遊戲程序員所使用的一種標準技術。

圖形加速器

圖形加速器也就是現在所說的顯卡。

隨着對高質量圖形的需求的增長,硬件廠商想出了一種方法以減少填充幀緩衝器所需的CPU時間。在Unix中常把這種硬件稱為圖形加速器。

常見的繪圖命令(多為幾何繪圖指令)以原始形式(raw form)發送給圖形加速器,加速器再把命令的結果點陣化(rasterize)給幀緩衝器。用這種方法,每條命令可以節約幾千到幾百萬個CPU周期,這樣CPU就可以轉去處理其他工作了。

早期加速器專注於提高2D GUI系統的性能,現代的則專注於實時產生3D圖像。常見的設計是使用OpenGL/DirectX之類的庫把命令發給圖形加速器,之後圖形驅動程序把命令(commands)轉換成加速器的GPU的指令(instructions),GPU使用這些微指令來計算出點陣化的結果。這些點陣化結果以位塊形式(bit blitted)傳送到幀緩衝器。之後幀緩衝器的信號與內置視頻疊加設備(通常用以在不修改幀緩衝器數據的情況下產生鼠標指針)組合,模擬特效則通過修改輸出信號的方式產生。模擬信號修改的一個例子是3dfx Voodoo卡使用的抗鋸齒技術,它為輸出信號添加一些輕微的模糊以淡化點陣化圖像的鋸齒。