2018年4月16日 星期一

系列番外篇之3─是時候拋棄Reclock了? madVR螢幕更新率微調功能簡介與實作

ReClock madVR在v0.92.0之後,在螢幕設定的"display modes" 底下多加了一個 "custom modes"的設定分頁,這個部分提供了一個非常有用的功能。在談到這個功能之前,可以回顧一下我之前在Reclock那篇文章之中所提到的關於同步的一些概念,在影片播放時一直存在的一個問題就是螢幕的更新率和影片的播放速率(影片幀數或其倍數)並非完全的一致,可能存在著或大或小的差異,而這個差異將造成影片在一定的周期內必須丟掉或重複一幀來保持影音的同步,而這個動作將造成畫面的頓挫感,雖然這個頓挫感不一定是每個人感覺得出來,但不可否認這個問題是存在的。
madshi為custom modes這個功能寫了一篇詳盡的介紹,裡面就有探討到這個問題,並提出各種可能的解決辦法以及優缺點,以下我將以那篇介紹為藍本,並加上個人的實際設置經驗來說明custom modes這個功能。

madshi的介紹文連結:
http://madvr.com/crt/CustomResTutorial.html




原文提到,影片播放由兩個重要的部分組成,分別是1.影像渲染(Video rendering) 以及 2.音訊渲染(Audio rendering),分別由各自的渲染器(renderer)來處理,madVR作為影像渲染器,它只負責處理影像的部分,不負責音訊的部分。同樣地,音訊渲染器也不處理影像的部分。那當兩邊的渲染器完全忽略彼此的話,為何影像跟聲音能夠同步呢?原因就在於兩邊的渲染器都必須跟隨一個"master clock"。
GPU和音效卡都各自有硬體時鐘迴路(hardware clock circuits),由這個部份來決定影像幀/音訊封包傳送到螢幕/擴大機的節奏/速率。可以想見,如果沒有一個當作基準的master clock存在的話,音訊或影像兩者在渲染時可能會有其中一個比另一個的速率還快,兩個時鐘之間產生偏移量,這時我們就會失去影像跟聲音的同步。
通常在DirectShow基礎的播放器,會以音訊時鐘(audio clock)當作是master clock,在此情形下可以確保音訊播放是完美的,不會有任何需要丟掉或重複資訊的情形,但相對的,影像渲染器就必須時時確保有跟隨master clock(也就是audio clock)的速率來保持影音同步,這意味著當影像時鐘(video clock)跑的稍微比音訊時鐘快或慢的話,影像渲染器就必須做重複就丟掉幀的動作,否則就會失去影音同步。

1.既存的解決方案─Reclock

Reclock作為一個特別的音訊渲染器,它的作法是藉由測量VSync interrupt並調整音訊時鐘(做為master clock),使得影像渲染器不必再丟棄或重複幀來保持影音同步,這意味著我們有可能在影像上得到一個完美流暢的播放,但問題在於現在變成要去調整音訊時鐘。Reclock 調整音訊時鐘的做法,是對音訊去做即時的重取樣,這機制基本上沒什麼問題,只是會造成一點點的音質損失,此外,對於bitstreaming(直接傳送音訊封包給擴大機解碼)的相容性不太好,而且Reclock目前已是半停止開發的狀態(亦沒有x64版本)。有一些和Reclock類似的音訊渲染器,如J.River的"VideoClock"和Sanaer,但缺點也差不多,在重取樣中損失一些音質,以及bitstreaming的問題。

2.新的解決方案─Custom display modes

在找尋完美解的任務中,先記得最原始的問題是,如果影像和音訊時鐘用不同的速率在跑,播放就無法達到完美,這種情形不是音訊渲染器要讓步(經由對音訊重取樣),就是影像渲染器要讓步(經由丟棄或重複幀)。現在停止這種讓步的作法,嘗試來解決最根本的問題,經由一種方法調整影像時鐘(video clock),讓其可以完美契合音訊時鐘(audio clock)。
GPU有一個"pixel clock"它是可編譯的,另外,VESA DMT timing standard要求顯示器必須接受pixel clock在5%內的變動,這對我們來說非常夠用,因此如果影像渲染器能夠在播放時即時對pixel clock作一些微小的修正,所有問題就迎刃而解了。但不幸的是,無論OS或GPU廠商都沒有提供任何方法能對pixel clock做即時的微小修正(也許出於種種原因),總之這條路徑不可行(此處不討論FreeSync/GSync之類技術)。
如果不能對pixel clock做即時調整,那麼我們就對它做靜態調整,這個是可行的,基本上我們只要測量音訊和影像時鐘的精確速率,然後告訴GPU之後用一個修正過的pixel clock去替換,不過實際上仍會遇到一些問題,光靠替換pixel clock仍無法達到完美的結果,基於這點,除了修正pixel clock之外,也要另外修正其他的時間參數(timing parameters),一個垂直和水平的"back porch",如此一來我們能夠得到足夠完美的結果。
談一下要如何讓GPU能夠使用我們修正過的時間參數(pixel clock + back porches),基本上我們可以透過覆蓋EDID來達成,而這個就是CRU(Custom Resolution Utility)這個軟體所做的事,不過這個方式有一些缺點,因此取而代之madVR是使用AMD、Intel、Nvidia各自的API讓madVR能夠定義自訂的時間參數給任何GPU輸出模式。
不過要注意的是,對pixel clock的調整幾乎可以在任何螢幕上被接受,但back porches就不一定,它處於灰色地帶,一些螢幕可以接受微調的back porches參數,一些則不然。在實際經驗上大部分螢幕還是可以接受的,但是不能保證。而這也是一種"試錯法"(trial and error)的過程,我們很難去預測螢幕能夠接受哪一種back porches的組合,過程中會有很多機會遇到一些模式是無法運作的(此時螢幕會全黑無顯示或顯示"不支援此模式"之類訊息)。


以下為實際設置說明:(以我的個人操作經驗為主,跟madshi原文的例子會有一些差異,英文還OK的建議先去看原文的說明再來看我這篇)

我們要對影像時鐘(video clock)做修正,實際上就是要對螢幕更新率做微調的動作,而手段就是前面講的給它一個pixel clock+back porches的組合去替換掉原來的。這邊我們可以看到螢幕的EDID(Extended Display Identification Data)資訊,特別注意"max vertical rate"和"max pixel clock",vertical rate就是指螢幕的垂直更新率,我們一般講螢幕更新率都是指這個,這個例子裡表示這螢幕最大支援到1920x1080 76Hz(不過通常只有60Hz附近能穩定使用)。


選取要進行操作的螢幕(螢幕必須是連接正常且已被啟用),在左邊display modes的設定頁裡,可以看到上方有"display modes"和"custom modes"兩個分頁可切換,在custom modes分頁下,有6個原生解析度下的常用更新率,以我這個螢幕來說,目前預設只支援1920x1080 60Hz這個更新率,其它顯示"missing mode"的那些,是OS目前沒列出的這個螢幕被支援的更新率,但實際上它有可能可以被支援,也有可能確實無法被支援,所以我們不妨試試看,但以我的實際操作經驗來說,一個原生只支援60Hz的螢幕,23、24、25那些基本上是不太可能能用的,不用浪費時間去試了,但59Hz(59.94左右)這個更新率幾乎都是可以開出來的,所以以下示範主要都是以59Hz為主(當然你可以去試其他更新率,操作步驟都是一樣的)。


我強烈建議各位一定要把59Hz開出來,為什麼呢?因為實際上59.94或29.97 fps的影片(不管是interlaced或progressive),要遠多於60或30 fps的影片,而透過AMD的FM或SVP之類的軟體補幀,主要輸出也是59.94 fps而非60 fps。
我這邊就播一個59.94 fps的影片做例子,可以看到它在60Hz的螢幕更新率下,顯示"1 frame repeat every 16.81 seconds",也就是madVR預測它會在每16.81秒時重複一個幀來保持同步,這並不是一個太好的結果,在不使用Reclock的前提下,我們預期使用59Hz(59.94)的更新率也許會得到一個比較理想的結果。


首先我們把59Hz那行點開


這邊可以看到相關的時間參數組合,可以發現這邊有EDID的參數存在,表示這個更新率幾乎確定是可以用的,如果沒有EDID的參數,我們就要從另外的4個組合去一個個試,然後即使開出來最後也未必能用。
這邊我們直接選EDID/CTA這組,然後按下右下"Test Mode"


如果螢幕能正常顯示的話,我們能看到下面這個倒數訊息,在它結束之前直接按下"Yes",則會加入新的更新率到列表中。如果螢幕是一片黑或者螢幕OSD顯示"不支援此模式"之類的訊息,則代表失敗,雖然這樣會看不到訊息但我們只要等它倒數結束就會回到原本的螢幕更新率。

按下"Yes"後會看到此訊息,告訴你有三個方法讓新的更新率可以被套用,分別是1)重開機,2)按下"reset gpu"按鈕,或是3)把螢幕連接線拔開再重插,這邊我唯一只建議重開機這個方法,其他兩個方法可能會有一些問題...


還沒重開機之前,可以看到59Hz現在狀態顯示為"custom timing - OS isn't aware of this mode",表示新增完成,但OS尚未認知此模式。


重開機後,變成"custom timing, not measured yet",表示目前OS已經認知到59Hz這個模式且也可以使用,但尚未做進一步測量。


這時回到display modes這頁,勾選自動切換更新率的選項,而restore original display mode...這項自己決定要不要勾,勾選的話會在關掉播放器後自動切回原本的更新率(不過注意每次更新率切換都會造成螢幕閃個幾秒鐘,所以這項自己衡量),不勾的話就是最後影片播放時切換成哪個,關掉後還是固定在那邊。下面"list all display modes madVR may switch to:",輸入我們目前已有的更新率,以此例來說我們目前有了1080p59和1080p60兩個更新率(用2K或是4K螢幕的朋友請前面自行替換成1440或2160),如果螢幕有其他的更新率模式可用也請自行加進去


回到custom modes,這時我們可以選擇59Hz,並按下上方的"optimize"(最佳化),就可以開始做微調測量作業。


出現這個訊息告訴你該做些什麼,1)首先你要播放一個含有音軌的影片,長度要超過10分鐘。2)確認該更新率模式在播放時有被啟用(如果上面有確實設定切換條件的話就不用擔心,否則的話就要先去顯卡驅動裡手動切換更新率)。3)要播滿10分鐘以上,在播放中不要做任何動作。4)播放完後回到此頁再按一次"optimize"
madVR會在背景自動完成測量作業


接下來開始播影片,因為我們這邊是測59.94Hz,所以要播的影片必須用59.94fps或29.97fps,有音軌且片長超過10分鐘的影片,以我的經驗,不要用任何需要去交錯(interlaced)的影片去播,會造成測量嚴重失準,一定要用逐行掃描(progressive)的影片,至於補幀的影片有沒有影響我就沒去測試,安全起見還是直接找59.94p或29.97p的片子。
播放中我們可以觀察,跟前面螢幕開60Hz時的數據比較起來,開59Hz測出來的數據已經好了很多,進步到每12多分鐘掉一幀,也就是說,就算沒有完成測量就直接使用目前的59Hz,也還是有一個勉強可以接受的結果。


超過10分鐘後就可以把影片關掉,這時可以發現59Hz的狀態變成"optimization data available",代表我們已經取得了測量的數據,這時我們可以雙擊此項或點"optimize"按鈕,把測好的數據叫出來。



這邊我們可以看到有許多組別及不同的測量結果,一項一項來解釋:

  • 首先,第一列的"current timings",是目前這個更新率模式下GPU所使用的時間參數,以及madVR所估計其多久會重複或丟掉一個幀的數據,我們看到它顯示"1 frame drop every 12.98 minutes",也就是大約每12.98分鐘會掉一幀,這跟我們上面從OSD看到的差不多。後面的compatibility是指相容性,這只是個估算值,理論上這個數值越高這組時間參數越有可能被螢幕接受,但這個數值並非絕對,不是越高螢幕就一定可以接受,也不是越低螢幕就一定無法接受,還是要實際套用看看才知道。因為current timings這組已經是目前在使用的,所以是最高的100,表示絕對可以相容。
  • 第二列的"measured timings",這是我們在這個更新率模式下(59Hz)使用的時間參數,跑一個59.94fps的影片10分鐘以上後所留下的測量結果,現在我們可以看到current timings和measured timings的參數完全一樣,但當等下我們套用下面任何一組其它的參數後,current timings就會變成套用後的參數,而measured timings則保持不變,直到我們做了下一次的10分鐘以上的測量播放後才會被洗掉,所以measured timings這項是做為一個保險用的備份,我們可以隨時套用它以回到最後一次完成測量時所使用的參數。
  • 第三列的"EDID/CTA",是EDID的標準時間參數,也是我們使用的初始預設值,不過在其他的更新率模式中不一定會有這一項。
  • 第四列到第七列,CVT或GTF的標準時間參數,在其他某些更新率模式下可能是你所使用的初始預設值,在經過我們10分種以上的測量後,有對pixel clock做一些微調,但這幾項都是所有其他組合都無法使用時才會考慮的。
  • 第八列到第十一列,"same pixel clock #...",目前Intel GPU的驅動對於pixel clock調整的支援並不好,因此使用Intel內顯時madVR無法藉由修改pixel clock計算出一個好的自訂更新率模式,在使用Intel內顯時,你可以套用的可能就是這幾項,它們保持pixel clock不變,只經由修改back porches來達到一個儘可能的改善結果。
  • 第十二列之後,"optimized pixel clock #...",這邊是經由測量後,可以達到接近完美的各種時間參數組合,這邊的選項都是"no frame drops/repeats expected",也就是預期不會出現週期性的重複幀或掉幀,我們的目標就是套用這一區的任何一個組合,不過這一區的參數組合都是同時有修改pixel clock和back porches,也就是說,不一定保證螢幕能夠接受,因此我們必須要一個一個試,運氣好可能第一個就成功,運氣不好可能試到最後一個也都無法被螢幕接受。以我的實際經驗來說,h back porch和v back porch跟measured timings的數值差距越小的,被螢幕接受的機率越高。
如果試完所有的optimized pixel clock 組合之後,都無法被螢幕接受的話,我建議再重跑一次10分鐘以上的測試,再去試新測出來的optimized pixel clock 組合,如果又都不行就再跑一次10分鐘測試,數次測出來的所有optimized pixel clock 真的全都不被接受,才去考慮same pixel clock的組合,如果連same pixel clock的組合也都不被接受,才去考慮EDID/CVT/GTF這些組合。


選好其中一項組合,並按下"Test Mode"按鈕,這時你可能會看到下面這個警告訊息,這個是表示我們要套用此更新率的參數組合時(例如現在要套用的是59Hz的模式),螢幕不能處在此更新率下(以此例來說螢幕不能是59Hz),因此看到此訊息後我們就要去顯卡驅動中先把螢幕更新率切換到別的(例如先切換到60Hz),再回到上面那一頁繼續套用。不過如果在display modes這頁,有勾選"restore original display mode..."那項的話,可能就會因為更新率已經被切回去而不會看到這個訊息,可以直接套用。
這個機制其實是一種保護措施,以此例來說如果套用新參數時我們處在59Hz更新率下,然後不幸的是螢幕沒辦法接受新參數,則我們重啟顯卡驅動後就是一片黑畫面,而且我們可能要進OS的安全模式才能回復,這會很麻煩,因此這個機制確保我們可以在顯卡不接受新參數時也能回到別的能正常顯示的更新率(例如60Hz)。


如果參數套用被目標螢幕接受的話,我們會看到目標螢幕是可以正常顯示的,而且會看到以下訊息,這時要在它結束倒數之前按下"Yes"。如果參數不被螢幕接受的話,目標螢幕會是黑畫面或是顯示"不支援此更新率"之類的訊息,這時請不要做任何動作,等它倒數結束就會自動回復了。

按下Yes後,會出現此訊息,我們這時最好再做一次重開機


這時我們播影片看看微調完成的新更新率模式,可以發現螢幕更新率現在更接近59.94Hz了,madVR也預測將近10小時才產生一個重複幀,這跟我們之前的結果比起來已是大幅的進步,我們不靠Reclock就做到了接近完美的同步。


只是播放影片10分鐘以上,就可以進入optimize的表格來看看新測出來的數據,可以看到我們用這個新的更新率模式可以跑出"1 frame repeat every 18.90 hours"的結果,這結果已經夠好了。如果你對測出來的數據還不滿意,或是一定要看到測出來是"1 frame repeat every x days"或"no frame drops/repeats expected"(測出來結果是7天以上不重複/丟掉幀就會顯示這個),你可以一直重複這個步驟,套用新測出來的optimized pixel clock  數值,再來一遍,直到測出你滿意的結果為止。


搞定了59Hz之後,接下來我們來試試看對60Hz做最佳化微調


不幸的是,出現了這樣的訊息,GPU拒絕了我對60Hz模式進行任何修改,據說這是NV驅動的一個bug,我不確定其他家顯卡會不會遇到,不過如果出現該訊息,基本上就得放棄對該更新率模式的微調了。


雖然不能微調,不過我還是跑一個60 fps的影片,來試試看原本的60Hz同步狀況如何,這邊看到madVR預測30分左右會掉一幀,雖然差強人意不過也勉強可接受了。


另外,有些人可能會有興趣去打開一些螢幕原本沒有但可能可以支援的更新率模式,例如71Hz(71.928)或72Hz,這些更新率模式可以對應23.976 fps或24 fps的影片。我們在custom modes那頁中,按下左上角的"add"按鈕,然後輸入想新增的更新率。

通常這種新增的更新率不會有EDID的參數,我們只能從下面四個中去試,看哪一個可以被螢幕接受,之後流程都跟前面一樣。
不過我的螢幕開71或72Hz從來沒有成功過,當下更新率是可以新增成功也有畫面,但重開機後,實際切換過去該解析度時就會變成黑畫面了。如果各位有興趣也可以自行嘗試。



這個是另外一個例子,我的panasonic電視,在還沒做任何動作時可以看到它原生支援23、24、29、30、59、60Hz這六種更新率


這是電視跑完微調流程後的結果,可以看到我多開出了一個原本顯卡沒抓到的50Hz模式,而且可以正常使用,不過我手邊沒有10分鐘以上的25p或50p影片所以沒完成微調最佳化。23Hz和59Hz完成了微調最佳化步驟,24Hz和60Hz遇到了被GPU拒絕的問題而維持原樣,25Hz、29Hz和30Hz因為沒使用到所以不管它(有50Hz、59Hz和60Hz可取代)。


電視的24Hz模式去播24 fps影片,沒完成微調動作不過同步結果可接受。


電視的23Hz模式去播23.976 fps影片,沒做微調前的狀況,同步狀況差強人意。


電視的23Hz模式,完成微調最佳化後,播23.976 fps影片的結果,同步狀況讓人非常滿意。


最後請注意幾個重點:

  1. 如果是使用NV卡的話,顯卡驅動請更新到390.65或390.77,但是暫時不要更新到390.77之後的版本,因為之後的驅動版本有bug,可能導致螢幕更新率微調失效(當然有些人說他沒遇到問題,如果堅持要試的話我也沒意見)。
  2. 任何顯卡驅動的更新可能導致整個流程要重來一遍(但也可能沒事,只是我要提示你們有這個風險在)。
  3. 如果是多螢幕的使用者,請對"看影片用"的那個螢幕做更新率微調的流程就好,因為我發現最後做微調動作的那個螢幕的更新率結果會套用到所有螢幕上(不太清楚是bug還是OS的限制)。
另外,madshi的原文中,有提到一些顯卡驅動既存的bug,順便附上給各位參考:

  • AMD主要有兩個比較大的問題,第一是接上4K電視時,顯卡驅動拒絕接受30Hz以上的custom modes;另一個問題是4K23p的custom mode無法運作,而24p則運作正常。
  • Intel顯卡驅動的問題是似乎無法接受24Hz以下的更新率,另外我們無法為23p和24p定義不同的custom modes(59p和60p亦同),最後,pixel clock 的調整無法良好運作。目前來看,Intel的問題是三者之中最多的...
  • Nvidia的問題,顯卡驅動有時會因為不明原因拒絕一些特定的custom mode (另外有一句提到一個跟"try" button有關的bug,因為不是很確定madshi原本指的意思就沒翻了)。





7 則留言:

  1. 我的display是120Hz模式,設定微調最佳化後,23/29/59 fps影片的結果,同步狀況讓人非常滿意.
    但在(微調最佳化)下,25/30/60/120 fps影片的結果,同步狀況差強人意。
    請問是否小弟設定錯誤?

    回覆刪除
  2. 感謝這篇文章,把我一直以來的疑惑都解開了,現在看動畫調整23.976x3=71.928後
    近乎完美
    這樣問題來了,幾乎大家點開播放器,然後就看影片,這樣不是大多數人都在錯誤的模式下觀看影音嗎

    回覆刪除
  3. 以下花一個禮拜5小時的測試結果!!測試環境:i7 8700k.gtx 1080ti.ddr4 8g
    在電腦螢幕測試72hz沒有問題(驅動)- 不過如果要4倍升頻的話,每秒要給出的基本張數可能達不到!!~(ex:ngu aa.ngu shp.卡皇皆只能開一次!!
    在大型電視螢幕新版驅動上測試23hz.24hz皆有問題,選擇custom mode的問題,EDID/CTA這些都不能選,選其他的可以,但是測試完,調整成功,重開機之後之後無效,一樣有重複.丟幀問題.跟未修正一樣,甚至更差..
    24hz原生下,ngu aa.ngu shp,4倍完全無壓力,每秒給40張,只吃到不到24張!

    回覆刪除
  4. 修正一下上述所講的
    以下花一個禮拜5小時的測試結果!!測試環境:i7 8700k.gtx 1080ti.ddr4 8g
    在電腦螢幕測試72hz沒有問題(最新版驅動)- 如果要升頻次的話,每秒要給出的基本張數可能達不到!!~(ex:ngu aa.ngu shp.卡皇皆只能翻一次!!
    在大型電視螢幕新版驅動上測試23hz.24hz皆有問題,選擇custom mode的問題,EDID/CTA不能選,選其他的可以,但是測試完,調整成功,重開機之後之後無效,一樣有重複.丟幀問題.跟未修正一樣,甚至更差..換成舊版之後,沒有問題,
    24hz原生下,ngu aa.ngu shp,4倍完全無壓力,每秒給40張,只吃到不到24張!又可享受到如電影院般的流暢效果,讓我覺得動畫開svp上在大型螢幕上沒有必要!

    回覆刪除
  5. 我的屏幕默认是59.936hz的,大概1-2min掉一帧……大概不用调了,好不爽啊

    回覆刪除
  6. 960m,397.64 驅動,59檔直接GPU driver reject,只能放棄了......

    回覆刪除
  7. 請問一下,Custom display modes可以跟Reclock一起使用嗎?
    因為N卡新版本的關係,導致無法微調成功(狀態有變成optimization data available,但實際上同步狀況沒變),可是我又不想換舊版本,所以想問說能不能和Reclock一起使用。
    另外,取消Reclock的同步功能只進行WASAPI輸出,這樣可以和Custom display modes一起用嗎?

    回覆刪除