幀緩衝器
此條目沒有列出任何參考或來源。 (2013年4月11日) |
幀緩衝器是一個視頻輸出設備,它從一個包含了完整幀數據的內存緩衝區驅動視頻顯示器。
內存緩衝區中的信息通常包含屏幕上每個像素的色彩值,色彩值常以1位、4位、8位、16位及 24位真彩色格式存儲。有時還有一個alpha通道來保存像素的透明度。驅動幀緩衝器所需的總內存量取決於輸出信號的分辨率、色彩深度和調色板大小。
向量顯示器比幀緩衝器出現得早,二者有很大的不同。使用向量顯示器時,只存儲了圖元(graphics primitives)的頂點。輸出顯示器的電子束按命令從一個頂點移動到另一個頂點,在這些點之間形成一個模擬的線條。而使用幀緩衝器時,電子束(如果顯示技術使用了電子束)按命令在整個屏幕上從左到右、從上到下描繪(trace),也就是電視機呈現廣播信號的方式。與此同時,屏幕上每個點的色彩信息從幀緩衝器中取出,形成一系列離散的像素。
顯示模式
個人和家用計算機中的幀緩衝器中常有一些定義好的模式,也就是幀緩衝器可以工作的模式。這些模式可以自動配置硬件以輸出不同的分辨率、色彩深度、內存布局及刷新頻率等。
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卡使用的抗鋸齒技術,它為輸出信號添加一些輕微的模糊以淡化點陣化圖像的鋸齒。