幀緩衝區

幀緩衝區是一個影像輸出裝置,它從一個包含了完整幀數據的主記憶體緩衝區驅動影片顯示器。

昇陽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卡使用的抗鋸齒技術,它為輸出訊號添加一些輕微的模糊以淡化點陣化圖像的鋸齒。