天天看點

什麼是圖形加速卡(四)

原文:http://www.azillionmonkeys.com/qed/accelerator.html

作者:Paul Hsieh

-潘宏 譯

-2013年2月

-email: [email protected]

-weibo.com/panhong101

(譯注:本文寫于2000年左右,很多内容稍顯過時。但作為了解GPU發展的曆史性、技術性材料,本文真是不可多得)

顯示器重新整理

最後一個瓶頸,是關于顯示器重新整理問題的。如我們在顯存帶寬一節中所說,顯示卡會消耗一定量的記憶體帶寬用來更新顯示器。然而為了避免畫面撕裂(Tearing)和閃爍(Flickering),3D應用程式一般會采用雙緩沖。也就是在兩個幀緩沖之間進行切換的過程中,顯示器會使用目前沒有被更新的那個幀緩沖(穩定的、可顯示的那個緩沖)來重新整理自己。如果你想更深入地了解非硬體加速的,用來解決閃爍問題的雙緩沖機制,可以閱讀我的這篇“無閃爍動畫”文章。

在任何情況下,當準備用顯存的某一部分重新整理螢幕以更新畫面前,為了避免畫面撕裂,必須等到目前重新整理動作(還沒完成的)完成後才能繼續進行。通常這需要等待“垂直回掃(Vertical Retrace)”的完成。然而該“等待周期”,是由顯示器本身的規格決定,而非CPU或者顯示卡決定,這和處理器标準相比太慢了(比如,在一個72Hz的顯示模式下,該速度是平均1/36秒重新整理一次)。

下圖展示了顯示器掃描槍的路徑:

什麼是圖形加速卡(四)

如圖所示,有些固有的實時事件會按時發生(否則顯示器就無法正确工作)。每個事件的長度由顯示器的目前模式所決定,這些模式被編好,并放入顯存數模轉換器中,該轉換器通常被稱為RAMDAC。RAMDAC必須擁有一定的顯存用于在需要時立即執行行重新整理(Line Refresh)。有些舊式顯示卡由于顯存帶寬限制而無法工作在特定模式下。甚至一些現代顯示卡也會因嚴格的顯存帶寬原因,在高分辨率下(比如1280x1024x24,72Hz)運作緩慢,或根本無法工作。

前文曾提到,VRAM最初用于試圖解決帶寬問題(允許每周期多次顯存通路),但它的成本較高,并且由于其複雜度導緻時鐘頻率受限。較新的解決方案,是簡單地将前面重新整理時通路到的資料,緩沖(Buffer)到RAMDAC中的一個小的緩存(Cache)中,這樣新的行重新整理資料通路,就可以和之前通路時的RAMDAC輸出,或水準回掃事件,存在時間上的交集。這種方案比較經濟,比VRAM方案有更好的伸縮性,但要在技術上達到準确,這需要一個靈敏的顯存仲裁器。

一般來說顯示卡廠商并不會開發精密的顯存仲裁器,而隻會給予足夠大的顯存帶寬,以滿足任何實際的帶寬需求。這就導緻在特定(經常會重複發生)情況下(比如一個比較大的通過總線傳輸的資料進入幀緩沖中),畫面會産生“閃爍”,因為它無法通路到還沒有傳輸完成的必要資料,以更新螢幕的特定部分。但市場證明了該方案無法被消費者接受,是以顯示卡廠商要麼降低了最大重新整理率,要麼禁止了高分辨率,都是為了避免這樣的顯示問題。

過去還有一種方案,就是顯示器的“交錯模式(Interlaced Mode)”。這種模式下,每次螢幕重新整理時隻進行隔行重新整理,奇數行和偶數行交替進行(NTSC制式的電視就是這種模式)。這降低了一半帶寬,但導緻了低品質、不穩定的輸出。這種方案仍無法被市場接受,從此消失了。

在任何情況下,準确決定翻轉幀緩沖的時機都是很重要的。大多數顯示卡都配有一個記憶體映射寄存器,用來傳回目前正掃描的模拟信号顯示行,也可能配有一個辨別回掃結束的觸發器或中斷這種能夠被主機監測到的機制。是以很簡單:等待指令隊列清空,接着等待掃描槍光束抵達螢幕底部,然後就開始翻轉幀緩沖(把掃描位址設定為另一個幀緩沖的首位址)。如果顯示卡的渲染速度大于等于顯示器重新整理率,就不會對渲染速度産生影響,但在目前(1998)的技術水準下,這基本無法做到,是以高分辨率往往會産生較大的性能波動。

以上這個同步問題很棘手,這促使了廠商Ziff-Davis讓兩個評測軟體(3D WinBench以及他們的一個新的純應用評測程式)避開了這個同步問題。此行為讓我感到很厭惡。Ziff-Davis還有那些對其施壓讓其就範的顯示卡公司,難道就不能意識到,完全可以通過适當的架構而不費力地解決該瓶頸嗎?就像我們解決遇到的其他那些問題一樣。

總之,這裡的主旨是盡量避免“回掃等待”。對此我提出過一些實施政策,這裡我通過一個例子來概述了我的觀點(MS-Word DOC格式,StarOffice也能打開它)。文章的中心思想是:越靠近RAMDAC做幀緩沖翻轉,所需等待的時間就越短。另外這些政策也沒有什麼開銷。

最後,為了避免在SGI流水線架構下的各種等待開銷,顯示卡必須必須引入一個三緩沖模式,這在我的“無閃爍動畫”文章中有所描述。這當然不是最令人滿意的方案,因為專用的紋理顯存經常會帶來更全面的性能提升。

當然,如果顯示卡廠商仍然很白癡(比如nVidia)的話,就算三緩沖也并不能解決所有問題。實作三緩沖機制的一個典型錯誤,就是當兩個後備緩沖填充完畢的時候,渲染被暫停以等待前緩沖完成其顯示,然後再按照順序翻轉兩個後備緩沖,這總是以特定的順序進行。這種錯誤的實作方式隻會不斷地導緻暫停而沒有根本解決該問題(這讓人們錯誤地以為,未來他們應該需要四緩沖、五緩沖、六十九緩沖...)。

正确的實作會厘清楚4種顯示緩沖類型:

(1)目前正在顯示的;

(2)目前正在填充的;

(3)填充完畢還沒顯示的;

(4)廢棄的或還沒填充的。

基本上規則是:顯示指針會被設定到(3),然後把之前指向的緩沖設定為(4)。當要找一個新的緩沖來渲染的時候,應該選擇(4)或者最長時間沒有更新的(3),完成後把緩沖設定為(3)。使用這個規則,顯示卡或主機都不需要暫停。

以上我們分析了在SGI架構下所有可能産生回掃延遲的可能。然而,延遲渲染(Deferred Render)卻産生了更多的延遲可能,這将在後面架構一節進行讨論。

繼續閱讀