垂直同步 繪製效率 顯示器重新整理頻率與幀率

2021-06-23 05:19:04 字數 2410 閱讀 9302

從後快取到顯示器

最近在看d3d的架構,在這過程中對幀率這個一直認為很簡單的東西有了更多的理解。在過去看來,幀率就是顯示卡渲染一幀所用時間的倒數,現在看來遠遠不是這個樣子。

要真正理解這個問題要從繪製資料從視訊記憶體中到螢幕的這乙個過程來說起,下圖就是這個過程  

視訊記憶體中存在前後快取,前快取就是螢幕上最終看到的畫素,而後快取是繪製使用,後快取繪製好一幀,通常就交換一次,寫給前快取,而顯示器則從前快取不斷的讀取資料。

交換幀率與重新整理幀率

通常我們很在意渲染的效率,其實就是繪製的效率,這就是圖中的f1,也成為交換幀率,f1決定了顯示卡一秒能繪製多少次,以前一直以為這就是使用者的幀率了,其實不是,因為還有其他因素。

我們看到顯示器讀取前快取也存在乙個頻率,即f2,f2也被稱為顯示卡的重新整理頻率,即顯示卡按照多少的頻率去講前快取的資料給顯示器繪製一次,它不管前快取的資料是否是新的還是舊的。由此可見我們終端使用者看到的幀率是f1 和 f2的共同結果。實際的幀率f應該表述為顯示器所能表現的快取交換幀率,即在1秒內有多少個後快取的傳遞到了顯示器。這樣看f=min(f1,f2),即受這兩個幀率的制約了。比如說你渲染很快,一秒繪製60次,但是顯示卡一秒只想顯示器刷30次,那幀率最高也只有30,再比如你渲染很慢,因為模型特別大,一秒畫10次,顯示器一秒刷60次,那使用者看到的實際幀率也只有10。到這裡似乎幀率是被這兩者決定的,但是其實還不是這樣。

垂直同步與幀率

從圖中可以看到一點就是前快取處於被後快取寫而被顯示器讀的狀態,那麼這過程就極有可能發生讀寫衝突,而顯示器的繪製是從上到下一行行重新整理的,一種典型的情況就是顯示器在讀這一幀時前快取被寫入新的下一幀資料,那麼顯示器的上部分和下部分將顯示不同幀的畫面,這就是常出現的「畫面撕裂」現象,他就是因為快取交換太快不等顯示器讀完而造成的。

為了解決這個現象,引入了「垂直同步」的相關技術,垂直同步就是指顯示器從上到下繪製乙個完整幀的畫面的乙個過程,在這個過程中,顯示卡保證不去改變前快取,如果這過程繪製好一幀,那麼後快取發現前快取在被讀取就不進行交換操作,這樣的結果會保證顯示器繪製不被撕裂,但是也帶來了另乙個問題,就是卡幀率,因為正常的交換幀率被顯示器的垂直同步各種打斷掉,交換幀率大大降低,降低最終幀率。

看來垂直同步與不垂直同步是兩個極端,他們分別代表著最高的畫面完整度與最高的幀率。所以在實踐中就產生了很多種折中的辦法,就是允許顯示卡最多在n幀重新整理中只打斷一次快取交換,n越大越接近完全不用垂直同步,幀率越高,n越小越接近垂直同步,撕裂現象概率越小。垂直同步、不垂直同步和幾種折中其實就對應了d3d9的交換引數的d3dpresent_donotwait

、d3dpresent_interval_immediate

和d3dpresent_interval_one

(~four

)。那麼最終的幀率

f應該接近與

min/(1+n),f2}

,通常f2

都是足夠大的。

所以幀率不僅與交換幀率、重新整理幀率有關,還與垂直同步策略有關,所以我們可以看到一些玩家的遊戲中關閉垂直同步會卡機,也有一些玩家開啟垂直同步會降低幀率,就是這個原因。

視訊記憶體

當然我們看到垂直同步會制約幀率的時候,是因為我們這個圖中的的前快取存只有一處,處於讀寫衝突狀態,那麼會想只要讓視訊記憶體不存在這種狀態不就行了嗎,那需要視訊記憶體非常大,後快取是生產者,顯示卡是消費者,前快取如果足夠的大(可以分成n多塊),那麼生產者就有可能不用顧忌的往快取上堆新東西,事實上完全的不存在衝突是不太可能的,因為視訊記憶體的大小永遠存在乙個限制,只要快取大小有限制,就必然可能出現生產者和消費者的衝突,存在衝突,要麼選擇生產者等消費者(生產降低,即幀率降低),要麼消費者拿到的東西會紊亂(即撕裂),但是視訊記憶體越大,這種潛在的衝突的可能性就越小,問題就越容易避免。

所以我麼看到顯示卡視訊記憶體較大的客戶端及時完全關閉垂直同步(即理論最大幀率)也不太容易撕裂,或者完全開啟垂直同步幀率還是非常高,視訊記憶體不僅有利於繪製也有利於解決前快取衝突提高幀率。

基於這些思考,所以在選擇渲染策略時,一定要充分考慮垂直同步的策略,根據潛在使用者的硬體、遊戲的繪製效率、重新整理效率一起考慮,知道幀率是由繪製效率,顯示卡重新整理效率和垂直同步策略三者共同決定的。在d3d9中微軟推薦使用的垂直同步策略時d3dpresent_interval_one

,即最接近完全垂直同步的折中策略,即最多在一次顯示卡重新整理中打斷一次快取交換,實際幀率應該是接近於

f1/2,

如果終端使用者看到的要在

30幀的話,z在

f2是60的情況下,那麼

f1要在

60幀以上。

垂直同步 繪製效率 顯示器重新整理頻率與幀率

從後快取到顯示器 最近在看d3d的架構,在這過程中對幀率這個一直認為很簡單的東西有了更多的理解。在過去看來,幀率就是顯示卡渲染一幀所用時間的倒數,現在看來遠遠不是這個樣子。要真正理解這個問題要從繪製資料從視訊記憶體中到螢幕的這乙個過程來說起,下圖就是這個過程 視訊記憶體中存在前後快取,前快取就是螢幕...

C 查詢顯示器得重新整理頻率

查詢顯示器得重新整理頻率。一 手工操作 windows10系統,開始 右鍵 系統 顯示 高階顯示設定 檢視重新整理頻率和解析度 二 使用c 查詢 public enum dmdo structlayout layoutkind.sequential,charset charset.auto publ...

顯示器基礎介紹 頻率問題

視訊頻寬低 視訊頻寬高 因電子束強弱反應稍慢,水平象點的差別將減小,略顯模糊。顯示器的技術指標 1 什麼是點距?它對顯示器上的影像有何影響?點距就是兩個同樣顏色螢光質之間的距離。舉例來說,就是乙個紅色螢光質與相鄰之紅色螢光質之間的對角距離,它通常是以公釐 mm 表示。點距就是兩個同樣顏色螢光質之間的...